{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "35ab4bec",
   "metadata": {},
   "source": [
    "# 基本介绍\n",
    "本代码是本人尝试基于非结构网格和有限体积法进行的浅水方程模拟实现，非结构网格由gmsh生成，地形为上下高，中间低的凹弧河道，其运行结果没有做精度验证。\n",
    "![alt text](image.png)\n",
    "运行结果\n",
    "![alt text](animation.gif)\n",
    "# 运行环境\n",
    "-python3.13+numpy+scipy+matplotlib+gmsh\n",
    "\n",
    "\n",
    "# 控制方程\n",
    "\n",
    "## 1.1 连续性方程（质量守恒）\n",
    "\n",
    "$$\\frac{\\partial h}{\\partial t} + \\frac{\\partial (hu)}{\\partial x} + \\frac{\\partial (hv)}{\\partial y} = 0$$\n",
    "\n",
    "## 1.2 动量方程（x方向）\n",
    "\n",
    "$$\\frac{\\partial (hu)}{\\partial t} + \\frac{\\partial}{\\partial x}\\left(hu^2 + \\frac{1}{2}gh^2\\right) + \\frac{\\partial (huv)}{\\partial y} = gh(S_{0x} - S_{fx})$$\n",
    "\n",
    "## 1.3 动量方程（y方向）\n",
    "\n",
    "$$\\frac{\\partial (hv)}{\\partial t} + \\frac{\\partial (huv)}{\\partial x} + \\frac{\\partial}{\\partial y}\\left(hv^2 + \\frac{1}{2}gh^2\\right) = gh(S_{0y} - S_{fy})$$\n",
    "\n",
    "### 变量定义\n",
    "\n",
    "| 符号     | 物理意义      | 单位 |\n",
    "| -------- | ------------- | ---- |\n",
    "| $h$      | 水深          | m    |\n",
    "| $u$      | x方向流速     | m/s  |\n",
    "| $v$      | y方向流速     | m/s  |\n",
    "| $g$      | 重力加速度    | m/s² |\n",
    "| $z_b$    | 河床高程      | m    |\n",
    "| $S_{0x}$ | x方向底坡     | -    |\n",
    "| $S_{0y}$ | y方向底坡     | -    |\n",
    "| $S_{fx}$ | x方向摩阻坡降 | -    |\n",
    "| $S_{fy}$ | y方向摩阻坡降 | -    |\n",
    "\n",
    "### 宽浅河道近似（$R_h \\approx h$）\n",
    "\n",
    "$$S_f = \\frac{n^2 V |V|}{h^{4/3}}$$\n",
    "\n",
    "## 1.4 各方向分量形式\n",
    "\n",
    "$$S_{fx} = \\frac{n^2 u \\sqrt{u^2 + v^2}}{h^{4/3}}$$\n",
    "$$S_{fy} = \\frac{n^2 v \\sqrt{u^2 + v^2}}{h^{4/3}}$$\n",
    "## 1.5底坡项计算\n",
    "\n",
    "$$S_{0x} = -\\frac{\\partial z_b}{\\partial x}$$\n",
    "$$S_{0y} = -\\frac{\\partial z_b}{\\partial y}$$\n",
    "\n",
    "## 2.1 干湿边界处理\n",
    "\n",
    "当 $h \\rightarrow 0$ 时：\n",
    "\n",
    "- 设置最小水深阈值：$h_{min} = 10^{-6}$ m\n",
    "- 摩阻项归零：$\\lim_{h \\to 0} S_f = 0$\n",
    "\n",
    "## 2.2 稳定性条件\n",
    "\n",
    "CFL条件：\n",
    "$$\\Delta t \\leq CFL \\cdot \\frac{\\min(\\Delta x, \\Delta y)}{\\max(|u| + \\sqrt{gh})}$$\n",
    "其中 $CFL \\leq 1$\n",
    "\n",
    "### 2.3 数值通量计算\n",
    "\n",
    "推荐格式：\n",
    "\n",
    "- HLL格式（Harten-Lax-van Leer）\n",
    "- HLLC格式（带接触间断的HLL）(本代码使用)\n",
    "- 通量差分裂格式\n",
    "\n",
    "# 本人认为模拟运行稳定性的关键\n",
    "- 干湿边界处理，水深h非负\n",
    "- HLLC的通量计算\n",
    "- CFL条件\n",
    "- 边界条件\n",
    "- 极端速度的限制（本代码基于Froude数限制）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "002833ca",
   "metadata": {},
   "outputs": [],
   "source": [
    "import gmsh\n",
    "import numpy as np\n",
    "import math\n",
    "from collections import defaultdict\n",
    "import sys\n",
    "def generate_mesh(lc=10):\n",
    "    \"\"\"使用Gmsh生成三角形网格\"\"\"\n",
    "\n",
    "    \n",
    "    gmsh.initialize()\n",
    "    gmsh.model.add(\"shallow_water\")\n",
    "    \n",
    "    # 创建矩形区域\n",
    "    rect = gmsh.model.occ.addRectangle(0, 0, 0, 100, 50)\n",
    "    gmsh.model.occ.synchronize()\n",
    "    \n",
    "    # 设置网格尺寸\n",
    "    gmsh.model.mesh.setSize(gmsh.model.getEntities(0), lc)\n",
    "    \n",
    "    # 生成2D网格\n",
    "    gmsh.model.mesh.generate(2)\n",
    "    # 设置地形高度\n",
    "    tags,nodescoor,_=gmsh.model.mesh.getNodes()\n",
    "    coors=nodescoor.reshape(-1,3)\n",
    "    for i,tag in enumerate(tags):\n",
    "        z=2*np.sin((1+coors[i][1]/50)*math.pi)\n",
    "        gmsh.model.mesh.setNode(tag,(coors[i][0],coors[i][1],z),[])\n",
    "    \n",
    "    if __name__ == '__main__':\n",
    "        gmsh.fltk.run()\n",
    "    # 获取节点和单元信息\n",
    "    nodes = gmsh.model.mesh.getNodes()[1].reshape(-1, 3)[:, :2]\n",
    "    zb = gmsh.model.mesh.getNodes()[1].reshape(-1, 3)[:, 2]\n",
    "    elem_types, elem_tags, elem_nodes = gmsh.model.mesh.getElements(2)\n",
    "    triangles = elem_nodes[0].reshape(-1, 3) - 1  # 转为0-based索引\n",
    "    \n",
    "    # 构建边到单元的映射\n",
    "    edge_to_elements = defaultdict(list)\n",
    "    for i, tri in enumerate(triangles):\n",
    "        edges = [\n",
    "            tuple(sorted((tri[0], tri[1]))),\n",
    "            tuple(sorted((tri[1], tri[2]))),\n",
    "            tuple(sorted((tri[2], tri[0])))\n",
    "        ]\n",
    "        for edge in edges:\n",
    "            edge_to_elements[edge].append(i)\n",
    "    \n",
    "    # 计算单元面积和中心\n",
    "    areas = []\n",
    "    centroids = []\n",
    "    for tri in triangles:\n",
    "        p = nodes[tri]\n",
    "        area = 0.5 * np.abs(np.cross(p[1]-p[0], p[2]-p[0]))\n",
    "        centroid = np.mean(p, axis=0)  # 仅取x,y坐标\n",
    "        areas.append(area)\n",
    "        centroids.append(centroid)\n",
    "    \n",
    "    gmsh.finalize()\n",
    "    return nodes, triangles, areas, centroids, edge_to_elements,zb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5a7de188",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_58380\\526584752.py:53: DeprecationWarning: Arrays of 2-dimensional vectors are deprecated. Use arrays of 3-dimensional vectors instead. (deprecated in NumPy 2.0)\n",
      "  area = 0.5 * np.abs(np.cross(p[1]-p[0], p[2]-p[0]))\n"
     ]
    }
   ],
   "source": [
    "nodes, elements, areas, centroids, edge_to_elements,zb = generate_mesh(lc=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "ad1ac4aa",
   "metadata": {},
   "outputs": [],
   "source": [
    "class ShallowWaterSolver:\n",
    "    def __init__(self, nodes, elements, areas, centroids, edge_to_elements,zb):\n",
    "        self.nodes = nodes[:,:2]  # 仅使用x,y坐标\n",
    "        self.zb =zb# nodes[:,2]   # 使用z坐标作为底床高程\n",
    "        self.elements = elements\n",
    "        self.areas = np.array(areas)\n",
    "        self.centroids = np.array(centroids)\n",
    "        self.edge_to_elements = edge_to_elements\n",
    "        # 物理参数\n",
    "        self.g = 9.81\n",
    "        self.rho = 1000\n",
    "        self.manning_slope = 0.01\n",
    "        # 初始化变量\n",
    "        self.h = np.zeros(len(elements))\n",
    "        self.u = np.zeros(len(elements))\n",
    "        self.v = np.zeros(len(elements))\n",
    "        # self.zb =np.zeros(len(nodes))\n",
    "\n",
    "       \n",
    "        \n",
    "        # 边界条件\n",
    "        self.boundary_type = 'wall'\n",
    "        self.boundary_zb = {}\n",
    "        \n",
    "        # 动态干河床阈值\n",
    "        self.h_min = 1e-6 * np.sqrt(np.mean(areas))\n",
    "        \n",
    "        # 计算几何信息\n",
    "        self._compute_geometry()\n",
    "        \n",
    "        # 水量监控\n",
    "        self.initial_mass = None\n",
    "        self.mass_history = []\n",
    "\n",
    "         # 确保初始水深非负\n",
    "        self.h = np.maximum(self.h, 0)\n",
    "\n",
    "        # 确保初始速度在干区域为零\n",
    "        mask = self.h < self.h_min\n",
    "        self.u[mask] = 0\n",
    "        self.v[mask] = 0\n",
    "        \n",
    "    def _compute_geometry(self):\n",
    "        \"\"\"计算边法向量和长度\"\"\"\n",
    "        self.edge_info = {}\n",
    "        for edge, els in self.edge_to_elements.items():\n",
    "            n1, n2 = edge\n",
    "            p1, p2 = self.nodes[n1], self.nodes[n2]\n",
    "            edge_vec = p2 - p1\n",
    "            length = np.linalg.norm(edge_vec)\n",
    "            t = edge_vec / (length)\n",
    "            n = np.array([-t[1], t[0]])\n",
    "            \n",
    "            # 验证法向量方向\n",
    "            if len(els) == 2:\n",
    "                c1, c2 = self.centroids[els[0]], self.centroids[els[1]]\n",
    "                if np.dot(n, c2 - c1) < 0:\n",
    "                    n = -n\n",
    "            else:\n",
    "                c = self.centroids[els[0]]\n",
    "                edge_center = 0.5 * (p1 + p2)\n",
    "                if np.dot(n, edge_center - c) < 0:\n",
    "                    n = -n\n",
    "            \n",
    "            self.edge_info[edge] = {\n",
    "                'length': length,\n",
    "                'normal': n,\n",
    "                'elements': els,\n",
    "                'edge_center': 0.5*(p1+p2)\n",
    "            }\n",
    "   \n",
    "    def _hllc_flux(self, UL, UR, n):\n",
    "        \"\"\"\n",
    "        增强鲁棒性的HLLC通量计算，包含数值安全措施\n",
    "        \"\"\"\n",
    "        # 安全处理极小值\n",
    "        EPS = 1e-10\n",
    "        SAFE_EPS = 1e-16\n",
    "        \n",
    "        # 解包状态量并确保非负\n",
    "        hL = max(UL[0], EPS)\n",
    "        huL, hvL = UL[1], UL[2]\n",
    "        hR = max(UR[0], EPS)\n",
    "        huR, hvR = UR[1], UR[2]\n",
    "        nx, ny = n\n",
    "        \n",
    "        # 安全除法计算速度\n",
    "        def safe_divide(a, b):\n",
    "            return a / (b + np.sign(b)*SAFE_EPS) if abs(b) > SAFE_EPS else 0.0\n",
    "        \n",
    "        uL = safe_divide(huL, hL)\n",
    "        vL = safe_divide(hvL, hL)\n",
    "        uR = safe_divide(huR, hR)\n",
    "        vR = safe_divide(hvR, hR)\n",
    "        \n",
    "        # 法向速度\n",
    "        qnL = uL * nx + vL * ny\n",
    "        qnR = uR * nx + vR * ny\n",
    "        \n",
    "        # 通量计算（限制h^2的大小）\n",
    "        hL_sq = min(hL**2, 1e10)\n",
    "        hR_sq = min(hR**2, 1e10)\n",
    "        \n",
    "        FL = np.array([\n",
    "            hL * qnL,\n",
    "            hL * uL * qnL + 0.5 * self.g * hL_sq * nx,\n",
    "            hL * vL * qnL + 0.5 * self.g * hL_sq * ny\n",
    "        ])\n",
    "        \n",
    "        FR = np.array([\n",
    "            hR * qnR,\n",
    "            hR * uR * qnR + 0.5 * self.g * hR_sq * nx,\n",
    "            hR * vR * qnR + 0.5 * self.g * hR_sq * ny\n",
    "        ])\n",
    "        \n",
    "        # 波速估计（带安全边际）\n",
    "        sqrt_ghL = np.sqrt(self.g * hL) if hL > EPS else 0.0\n",
    "        sqrt_ghR = np.sqrt(self.g * hR) if hR > EPS else 0.0\n",
    "        sL = min(qnL - sqrt_ghL - EPS, qnR - sqrt_ghR - EPS)\n",
    "        sR = max(qnL + sqrt_ghL + EPS, qnR + sqrt_ghR + EPS)\n",
    "        \n",
    "        # 接触波速计算（三重保护）\n",
    "        denom = hR * (qnR - sR) - hL * (qnL - sL)\n",
    "        if abs(denom) > EPS:\n",
    "            s_star = (sL * hR * (qnR - sR) - sR * hL * (qnL - sL)) / denom\n",
    "        else:\n",
    "            s_star = 0.5 * (sL + sR)\n",
    "        \n",
    "        # 物理限制\n",
    "        s_star = np.clip(s_star, sL + EPS, sR - EPS)\n",
    "        \n",
    "        # 中间状态计算（安全除法）\n",
    "        denom_L = sL - s_star\n",
    "        factor_L = safe_divide(hL * (sL - qnL), denom_L) if abs(denom_L) > EPS else 0.0\n",
    "        U_star_L = factor_L * np.array([1.0, uL + (s_star - qnL)*nx, vL + (s_star - qnL)*ny])\n",
    "        \n",
    "        denom_R = sR - s_star\n",
    "        factor_R = safe_divide(hR * (sR - qnR), denom_R) if abs(denom_R) > EPS else 0.0\n",
    "        U_star_R = factor_R * np.array([1.0, uR + (s_star - qnR)*nx, vR + (s_star - qnR)*ny])\n",
    "        \n",
    "        # 通量选择\n",
    "        if sL >= 0:\n",
    "            return FL\n",
    "        elif sR <= 0:\n",
    "            return FR\n",
    "        elif s_star >= 0:\n",
    "            return FL + sL * (U_star_L - UL)\n",
    "        else:\n",
    "            return FR + sR * (U_star_R - UR)\n",
    "\n",
    "    \n",
    "    def _compute_fluxes(self):\n",
    "        \"\"\"计算所有边通量，增强干湿处理\"\"\"\n",
    "        fluxes = {}\n",
    "        for edge, info in self.edge_info.items():\n",
    "            n = info['normal']\n",
    "            els = info['elements']\n",
    "\n",
    "            if len(els) == 2:\n",
    "                elL, elR = els\n",
    "                hL, hR = max(self.h[elL], 0), max(self.h[elR], 0)\n",
    "\n",
    "                # 干湿处理\n",
    "                if hL < self.h_min and hR < self.h_min:\n",
    "                    fluxes[edge] = np.zeros(3)\n",
    "                    continue\n",
    "\n",
    "                UL = np.array([hL, hL*self.u[elL], hL*self.v[elL]])\n",
    "                UR = np.array([hR, hR*self.u[elR], hR*self.v[elR]])\n",
    "                F = self._hllc_flux(UL, UR, n)\n",
    "            else:\n",
    "                el = els[0]\n",
    "                h = max(self.h[el], 0)\n",
    "                UL = np.array([h, h*self.u[el], h*self.v[el]])\n",
    "                UR = UL.copy()  # 固壁边界\n",
    "                UR[1:] *= -1    # 速度反向\n",
    "                F = self._hllc_flux(UL, UR, n)\n",
    "                # F= np.zeros(3)\n",
    "\n",
    "            fluxes[edge] = F * info['length']\n",
    "        return fluxes\n",
    "    \n",
    "  \n",
    "    def _compute_sources(self):\n",
    "        \"\"\"计算源项（地形和摩擦力）\"\"\"\n",
    "        S = np.zeros((len(self.elements), 3))  # [S_h, S_hu, S_hv]\n",
    "        \n",
    "        # 1. 计算底床坡度源项 (S_b)\n",
    "        S_b = self._compute_bed_slope_source()\n",
    "        \n",
    "        # 2. 计算摩擦力源项 (S_f)\n",
    "        S_f = self._compute_friction_source()\n",
    "        \n",
    "        # 合并源项\n",
    "        S[:, 1:] = S_b + S_f  # 只影响动量方程(hv,hu)\n",
    "        \n",
    "        return S\n",
    "   \n",
    "    def _compute_bed_slope_source(self):\n",
    "        \"\"\"计算底床坡度源项: [0, -gh*dz/dx, -gh*dz/dy]\"\"\"\n",
    "        S_b = np.zeros((len(self.elements), 2))  # [S_hu, S_hv]\n",
    "        \n",
    "        for i, element in enumerate(self.elements):\n",
    "            # 获取三角形三个顶点坐标和高程\n",
    "            p0, p1, p2 = [self.nodes[n] for n in element]\n",
    "            z0, z1, z2 = [self.zb[n] for n in element]\n",
    "            \n",
    "            # 计算底床梯度 (dz/dx, dz/dy)\n",
    "            # 通过三角形平面拟合得到梯度\n",
    "            A = np.array([\n",
    "                [1, p0[0], p0[1]],\n",
    "                [1, p1[0], p1[1]],\n",
    "                [1, p2[0], p2[1]]\n",
    "            ])\n",
    "            b = np.array([z0, z1, z2])\n",
    "            \n",
    "            try:\n",
    "                # 解线性方程组 Ax = b，其中 x = [a, b, c]，z = a + b*x + c*y\n",
    "                coeffs = np.linalg.solve(A, b)\n",
    "                dzdx = coeffs[1]\n",
    "                dzdy = coeffs[2]\n",
    "            except np.linalg.LinAlgError:\n",
    "                # 如果矩阵奇异（如共线点），使用有限差分近似\n",
    "                dzdx = (z1 - z0) / (p1[0] - p0[0] + 1e-10)\n",
    "                dzdy = (z2 - z0) / (p2[1] - p0[1] + 1e-10)\n",
    "            \n",
    "            # 底床坡度源项\n",
    "            if self.h[i] > self.h_min:\n",
    "                S_b[i, 0] = -self.g * self.h[i] * dzdx*self.areas[i]  # -gh dz/dx\n",
    "                S_b[i, 1] = -self.g * self.h[i] * dzdy*self.areas[i]  # -gh dz/dy\n",
    "        \n",
    "        return S_b\n",
    "   \n",
    "    # def _compute_friction_source(self):\n",
    "    #     \"\"\"计算摩擦力源项: [0, -tau_x, -tau_y] (曼宁公式)\"\"\"\n",
    "    #     S_f = np.zeros((len(self.elements), 2))  # [S_hu, S_hv]\n",
    "        \n",
    "    #     # 安全参数\n",
    "    #     EPS = 1e-6  # 比h_min更小的阈值\n",
    "    #     MAX_CF = 1e3  # 最大允许的摩擦系数\n",
    "        \n",
    "    #     for i in range(len(self.elements)):\n",
    "    #         h = self.h[i]\n",
    "    #         if h > self.h_min:\n",
    "    #             u = self.u[i]\n",
    "    #             v = self.v[i]\n",
    "    #             velocity = np.sqrt(u**2 + v**2)\n",
    "                \n",
    "    #             # 安全计算曼宁系数\n",
    "    #             h_safe = max(h, EPS)\n",
    "    #             Cf = min(self.g * self.manning_slope**2 / (h_safe**(1/3)), MAX_CF)\n",
    "                \n",
    "    #             # 计算剪切应力（带速度限制）\n",
    "    #             velocity_safe = min(velocity, 3)  # 限制最大速度\n",
    "    #             # print(f\"CF: {Cf},velocity: {velocity}\")\n",
    "    #             tau_x = Cf * u * velocity_safe\n",
    "    #             tau_y = Cf * v * velocity_safe\n",
    "                \n",
    "    #             # 应用面积加权（因为这是单元源项）\n",
    "    #             edge_length=math.sqrt(self.areas[i])\n",
    "                # S_f[i, 0] = -tau_x * edge_length\n",
    "                # S_f[i, 1] = -tau_y * edge_length\n",
    "        \n",
    "    #     return S_f\n",
    "    def _compute_friction_source(self):\n",
    "        \"\"\"半隐式处理摩擦力源项\"\"\"\n",
    "        S_f = np.zeros((len(self.elements), 2))\n",
    "        \n",
    "        EPS = 1e-6\n",
    "        MAX_RELAX = 0.5  # 隐式系数，0=显式，1=全隐式\n",
    "        \n",
    "        for i in range(len(self.elements)):\n",
    "            h = self.h[i]\n",
    "            if h > self.h_min:\n",
    "                u = self.u[i]\n",
    "                v = self.v[i]\n",
    "                velocity = np.sqrt(u**2 + v**2)\n",
    "                \n",
    "                h_safe = max(h, EPS)\n",
    "                Cf = self.g * self.manning_slope**2 / (h_safe**(1/3))\n",
    "                \n",
    "                # 半隐式处理因子\n",
    "                factor = 1.0 / (1.0 + MAX_RELAX * Cf * velocity * self.dt / h_safe)\n",
    "                \n",
    "                tau_x = Cf * u * velocity * factor\n",
    "                tau_y = Cf * v * velocity * factor\n",
    "                \n",
    "                S_f[i, 0] = -tau_x * self.areas[i]\n",
    "                S_f[i, 1] = -tau_y * self.areas[i]\n",
    "        \n",
    "        return S_f\n",
    "    def _check_mass_balance(self):\n",
    "        \"\"\"检查水量平衡\"\"\"\n",
    "        current_mass = np.sum(self.h * self.areas)\n",
    "        if self.initial_mass is None:\n",
    "            self.initial_mass = current_mass\n",
    "        self.mass_history.append(current_mass)\n",
    "        \n",
    "        if len(self.mass_history) > 10:\n",
    "            imbalance = (current_mass - self.initial_mass) / self.initial_mass\n",
    "            if abs(imbalance) > 0.01:  # 允许1%误差\n",
    "                print(f\"警告：水量不平衡 {imbalance*100:.2f}%\")\n",
    "\n",
    "    def time_step(self, dt):\n",
    "        \"\"\"执行一个时间步，增加稳定性检查\"\"\"\n",
    "        # 限制时间步长\n",
    "        max_velocity = np.sqrt(np.max(self.u**2 + self.v**2)) + np.sqrt(self.g * np.max(self.h))\n",
    "        # print(f\"dt: {dt}, max_velocity: {max_velocity}\")\n",
    "        if max_velocity > 0:\n",
    "            self.dt=dt = min(dt, 0.5 * np.min(np.sqrt(self.areas)) / max_velocity)\n",
    "         # 计算最大允许的摩擦力时间步长\n",
    "        # h_avg = np.mean(self.h[self.h > self.h_min])\n",
    "        # if h_avg > 0:\n",
    "        #     max_friction_dt = h_avg / (self.g * self.manning_slope**2 * 10.0)\n",
    "        #     dt = min(dt, max_friction_dt)\n",
    "            \n",
    "        fluxes = self._compute_fluxes()\n",
    "        S = self._compute_sources()\n",
    "        \n",
    "        # 更新守恒量\n",
    "        RHS = np.zeros((len(self.elements), 3))\n",
    "        for edge, info in self.edge_info.items():\n",
    "            els = info['elements']\n",
    "            F = fluxes[edge]\n",
    "            \n",
    "            if len(els) == 2:\n",
    "                RHS[els[0]] -= F\n",
    "                RHS[els[1]] += F\n",
    "            else:\n",
    "                RHS[els[0]] -= F\n",
    "        \n",
    "        RHS += S\n",
    "        \n",
    "        # 更新变量（带限制器）\n",
    "        U = np.column_stack([self.h, self.h*self.u, self.h*self.v])\n",
    "        U += dt * RHS / (self.areas[:, np.newaxis] + 1e-16)\n",
    "        \n",
    "        # 处理负水深和极端值\n",
    "        U[:, 0] = np.maximum(U[:, 0], 0)  # 确保水深非负\n",
    "        U[:, 1:] = np.where(U[:, 0:1] > self.h_min, U[:, 1:], 0)  # 干区域速度为零\n",
    "        \n",
    "        # 限制最大水深和速度\n",
    "        # max_h = 1e4  # 根据实际情况调整\n",
    "        # max_vel = 100.0\n",
    "        # U[:, 0] = np.minimum(U[:, 0], max_h)\n",
    "        # vel_mag = np.sqrt((U[:, 1]/(U[:, 0]+1e-16))**2 + (U[:, 2]/(U[:, 0]+1e-16))**2)\n",
    "        # mask = vel_mag > max_vel\n",
    "        # U[mask, 1:] = U[mask, 1:] * max_vel / (vel_mag[mask, np.newaxis] + 1e-16)\n",
    "        \n",
    "        # self.h_initial=1\n",
    "        # max_h = max(10 * np.max(self.h_initial), 100.0)  # 示例\n",
    "        # min_h = 1e-6  # 比h_min更小的值\n",
    "        # U[:, 0] = np.clip(U[:, 0], min_h, max_h)\n",
    "\n",
    "        # 基于Froude数限制\n",
    "        Fr_max = 1.0  # 合理物理限制\n",
    "        gh = np.sqrt(self.g * (U[:, 0] + 1e-16))\n",
    "        vel_mag = np.sqrt((U[:, 1]/(U[:, 0]+1e-16))**2 + (U[:, 2]/(U[:, 0]+1e-16))**2)\n",
    "        Fr = vel_mag / (gh + 1e-16)\n",
    "        mask = Fr > Fr_max\n",
    "        U[mask, 1:] = U[mask, 1:] * Fr_max / (Fr[mask, np.newaxis] + 1e-16)\n",
    "\n",
    "        self.h = U[:, 0]\n",
    "        mask = self.h > self.h_min\n",
    "        self.u = np.where(mask, U[:, 1]/(self.h + 1e-16), 0)\n",
    "        self.v = np.where(mask, U[:, 2]/(self.h + 1e-16), 0)\n",
    "        return dt\n",
    "        # 水量平衡检查\n",
    "        #self._check_mass_balance()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9ab19306",
   "metadata": {},
   "outputs": [],
   "source": [
    "def set_initial_conditions(solver, case='dam_break'):\n",
    "    \"\"\"设置初始条件\"\"\"\n",
    "    if case == 'dam_break':\n",
    "        # 溃坝问题：左侧高水位\n",
    "        solver.h = np.where(solver.centroids[:,0] < 20,1.0, 0.0)#2008071\n",
    "        solver.u.fill(0)\n",
    "        solver.v.fill(0)\n",
    "        # solver.zb.fill(0)\n",
    "        # print(solver.nodes)\n",
    "        # solver.zb+=[ np.sin((1+nd[1]/100)*math.pi) for nd in solver.nodes]\n",
    "        # print(solver.zb)\n",
    "        # 标记边界类型\n",
    "        solver.boundary_type = 'wall'\n",
    "    \n",
    "    elif case == 'flow_channel':\n",
    "        # 河道流动：上游入流\n",
    "        solver.h = np.ones(len(solver.elements))\n",
    "        solver.u = np.where(solver.centroids[:,0] < 0.1, 1.0, 0)\n",
    "        solver.v.fill(0)\n",
    "        \n",
    "        # 设置底床坡度\n",
    "        solver.zb = -0.1 * solver.nodes[:,0]\n",
    "        \n",
    "        # 设置开边界\n",
    "        solver.boundary_type = 'open'\n",
    "        for edge in solver.edge_info:\n",
    "            if any(solver.nodes[edge][:,0] < 0.01):  # 左边界\n",
    "                solver.boundary_zb[edge] = 1.0  # 上游水位"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "2c95fa4d",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_58380\\526584752.py:53: DeprecationWarning: Arrays of 2-dimensional vectors are deprecated. Use arrays of 3-dimensional vectors instead. (deprecated in NumPy 2.0)\n",
      "  area = 0.5 * np.abs(np.cross(p[1]-p[0], p[2]-p[0]))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Time: 0.17,max h: 1.00,max u: 1.74,max v: 0.62\n",
      "Time: 0.27,max h: 1.00,max u: 1.23,max v: 0.52\n",
      "Time: 0.39,max h: 1.00,max u: 1.69,max v: 0.61\n",
      "Time: 0.50,max h: 1.01,max u: 1.82,max v: 0.73\n",
      "Time: 0.60,max h: 1.01,max u: 1.87,max v: 0.86\n",
      "Time: 0.70,max h: 1.02,max u: 1.89,max v: 0.97\n",
      "Time: 0.80,max h: 1.02,max u: 1.94,max v: 1.08\n",
      "Time: 0.90,max h: 1.03,max u: 1.97,max v: 1.19\n",
      "Time: 1.00,max h: 1.04,max u: 1.98,max v: 1.29\n",
      "Time: 1.10,max h: 1.04,max u: 1.98,max v: 1.39\n",
      "Time: 1.20,max h: 1.05,max u: 1.98,max v: 1.48\n",
      "Time: 1.30,max h: 1.06,max u: 1.98,max v: 1.56\n",
      "Time: 1.39,max h: 1.07,max u: 1.98,max v: 1.66\n",
      "Time: 1.49,max h: 1.08,max u: 1.99,max v: 1.76\n",
      "Time: 1.58,max h: 1.10,max u: 2.03,max v: 1.84\n",
      "Time: 1.68,max h: 1.11,max u: 2.06,max v: 1.91\n",
      "Time: 1.77,max h: 1.12,max u: 2.09,max v: 1.97\n",
      "Time: 1.86,max h: 1.14,max u: 2.12,max v: 2.04\n",
      "Time: 1.95,max h: 1.16,max u: 2.14,max v: 2.11\n",
      "Time: 2.04,max h: 1.17,max u: 2.16,max v: 2.18\n",
      "Time: 2.13,max h: 1.19,max u: 2.18,max v: 2.24\n",
      "Time: 2.22,max h: 1.21,max u: 2.19,max v: 2.29\n",
      "Time: 2.31,max h: 1.23,max u: 2.20,max v: 2.32\n",
      "Time: 2.39,max h: 1.25,max u: 2.20,max v: 2.37\n",
      "Time: 2.48,max h: 1.27,max u: 2.21,max v: 2.41\n",
      "Time: 2.56,max h: 1.29,max u: 2.21,max v: 2.46\n",
      "Time: 2.65,max h: 1.32,max u: 2.22,max v: 2.51\n",
      "Time: 2.73,max h: 1.34,max u: 2.25,max v: 2.52\n",
      "Time: 2.81,max h: 1.37,max u: 2.28,max v: 2.54\n",
      "Time: 2.90,max h: 1.40,max u: 2.32,max v: 2.57\n",
      "Time: 2.98,max h: 1.43,max u: 2.34,max v: 2.60\n",
      "Time: 3.06,max h: 1.46,max u: 2.36,max v: 2.63\n",
      "Time: 3.14,max h: 1.49,max u: 2.37,max v: 2.66\n",
      "Time: 3.22,max h: 1.52,max u: 2.38,max v: 2.65\n",
      "Time: 3.30,max h: 1.56,max u: 2.39,max v: 2.67\n",
      "Time: 3.38,max h: 1.59,max u: 2.40,max v: 2.66\n",
      "Time: 3.45,max h: 1.63,max u: 2.41,max v: 2.68\n",
      "Time: 3.53,max h: 1.67,max u: 2.42,max v: 2.70\n",
      "Time: 3.61,max h: 1.71,max u: 2.46,max v: 2.71\n",
      "Time: 3.68,max h: 1.75,max u: 2.50,max v: 2.71\n",
      "Time: 3.76,max h: 1.79,max u: 2.54,max v: 2.71\n",
      "Time: 3.83,max h: 1.83,max u: 2.57,max v: 2.68\n",
      "Time: 3.91,max h: 1.87,max u: 2.61,max v: 2.68\n",
      "Time: 3.98,max h: 1.91,max u: 2.64,max v: 2.68\n",
      "Time: 4.05,max h: 1.96,max u: 2.66,max v: 2.68\n",
      "Time: 4.13,max h: 2.00,max u: 2.69,max v: 2.68\n",
      "Time: 4.20,max h: 2.04,max u: 2.71,max v: 2.68\n",
      "Time: 4.27,max h: 2.07,max u: 2.73,max v: 2.66\n",
      "Time: 4.34,max h: 2.11,max u: 2.75,max v: 2.64\n",
      "Time: 4.41,max h: 2.14,max u: 2.77,max v: 2.63\n",
      "Time: 4.49,max h: 2.17,max u: 2.80,max v: 2.60\n",
      "Time: 4.56,max h: 2.19,max u: 2.83,max v: 2.59\n",
      "Time: 4.63,max h: 2.22,max u: 2.87,max v: 2.56\n",
      "Time: 4.70,max h: 2.23,max u: 2.90,max v: 2.54\n",
      "Time: 4.77,max h: 2.24,max u: 2.94,max v: 2.52\n",
      "Time: 4.83,max h: 2.25,max u: 2.98,max v: 2.50\n",
      "Time: 4.90,max h: 2.26,max u: 3.01,max v: 2.49\n",
      "Time: 4.97,max h: 2.26,max u: 3.04,max v: 2.47\n",
      "Time: 5.04,max h: 2.26,max u: 3.08,max v: 2.45\n",
      "Time: 5.11,max h: 2.25,max u: 3.11,max v: 2.41\n",
      "Time: 5.17,max h: 2.24,max u: 3.13,max v: 2.39\n",
      "Time: 5.24,max h: 2.23,max u: 3.16,max v: 2.37\n",
      "Time: 5.31,max h: 2.22,max u: 3.19,max v: 2.35\n",
      "Time: 5.37,max h: 2.21,max u: 3.21,max v: 2.33\n",
      "Time: 5.44,max h: 2.19,max u: 3.23,max v: 2.31\n",
      "Time: 5.51,max h: 2.17,max u: 3.25,max v: 2.28\n",
      "Time: 5.57,max h: 2.15,max u: 3.27,max v: 2.26\n",
      "Time: 5.64,max h: 2.13,max u: 3.29,max v: 2.24\n",
      "Time: 5.71,max h: 2.11,max u: 3.30,max v: 2.21\n",
      "Time: 5.78,max h: 2.09,max u: 3.31,max v: 2.18\n",
      "Time: 5.84,max h: 2.07,max u: 3.33,max v: 2.16\n",
      "Time: 5.91,max h: 2.05,max u: 3.34,max v: 2.13\n",
      "Time: 5.98,max h: 2.03,max u: 3.34,max v: 2.11\n",
      "Time: 6.04,max h: 2.01,max u: 3.35,max v: 2.10\n",
      "Time: 6.11,max h: 1.99,max u: 3.36,max v: 2.08\n",
      "Time: 6.18,max h: 1.96,max u: 3.36,max v: 2.07\n",
      "Time: 6.25,max h: 1.94,max u: 3.36,max v: 2.05\n",
      "Time: 6.31,max h: 1.92,max u: 3.37,max v: 2.03\n",
      "Time: 6.38,max h: 1.90,max u: 3.37,max v: 2.01\n",
      "Time: 6.45,max h: 1.87,max u: 3.37,max v: 1.98\n",
      "Time: 6.52,max h: 1.85,max u: 3.37,max v: 1.94\n",
      "Time: 6.59,max h: 1.83,max u: 3.37,max v: 1.92\n",
      "Time: 6.66,max h: 1.80,max u: 3.36,max v: 1.90\n",
      "Time: 6.73,max h: 1.78,max u: 3.36,max v: 1.88\n",
      "Time: 6.80,max h: 1.75,max u: 3.36,max v: 1.86\n",
      "Time: 6.87,max h: 1.73,max u: 3.35,max v: 1.82\n",
      "Time: 6.94,max h: 1.71,max u: 3.35,max v: 1.80\n",
      "Time: 7.01,max h: 1.68,max u: 3.34,max v: 1.78\n",
      "Time: 7.08,max h: 1.66,max u: 3.34,max v: 1.74\n",
      "Time: 7.15,max h: 1.63,max u: 3.33,max v: 1.72\n",
      "Time: 7.22,max h: 1.61,max u: 3.33,max v: 1.70\n",
      "Time: 7.29,max h: 1.59,max u: 3.32,max v: 1.67\n",
      "Time: 7.37,max h: 1.56,max u: 3.31,max v: 1.65\n",
      "Time: 7.44,max h: 1.54,max u: 3.30,max v: 1.63\n",
      "Time: 7.51,max h: 1.52,max u: 3.30,max v: 1.60\n",
      "Time: 7.58,max h: 1.49,max u: 3.29,max v: 1.57\n",
      "Time: 7.66,max h: 1.47,max u: 3.28,max v: 1.55\n",
      "Time: 7.73,max h: 1.45,max u: 3.27,max v: 1.54\n",
      "Time: 7.81,max h: 1.43,max u: 3.27,max v: 1.52\n",
      "Time: 7.88,max h: 1.40,max u: 3.26,max v: 1.48\n",
      "Time: 7.96,max h: 1.38,max u: 3.25,max v: 1.46\n",
      "Time: 8.03,max h: 1.36,max u: 3.24,max v: 1.45\n",
      "Time: 8.11,max h: 1.34,max u: 3.23,max v: 1.43\n",
      "Time: 8.19,max h: 1.32,max u: 3.23,max v: 1.39\n",
      "Time: 8.26,max h: 1.30,max u: 3.22,max v: 1.36\n",
      "Time: 8.34,max h: 1.28,max u: 3.21,max v: 1.35\n",
      "Time: 8.42,max h: 1.26,max u: 3.20,max v: 1.34\n",
      "Time: 8.50,max h: 1.25,max u: 3.19,max v: 1.31\n",
      "Time: 8.57,max h: 1.23,max u: 3.19,max v: 1.27\n",
      "Time: 8.65,max h: 1.21,max u: 3.18,max v: 1.26\n",
      "Time: 8.73,max h: 1.19,max u: 3.17,max v: 1.26\n",
      "Time: 8.81,max h: 1.18,max u: 3.16,max v: 1.23\n",
      "Time: 8.89,max h: 1.16,max u: 3.16,max v: 1.19\n",
      "Time: 8.97,max h: 1.15,max u: 3.15,max v: 1.16\n",
      "Time: 9.05,max h: 1.13,max u: 3.14,max v: 1.16\n",
      "Time: 9.13,max h: 1.12,max u: 3.13,max v: 1.15\n",
      "Time: 9.22,max h: 1.11,max u: 3.12,max v: 1.11\n",
      "Time: 9.30,max h: 1.09,max u: 3.11,max v: 1.08\n",
      "Time: 9.38,max h: 1.08,max u: 3.10,max v: 1.08\n",
      "Time: 9.46,max h: 1.07,max u: 3.09,max v: 1.07\n",
      "Time: 9.55,max h: 1.06,max u: 3.08,max v: 1.03\n",
      "Time: 9.63,max h: 1.05,max u: 3.07,max v: 1.02\n",
      "Time: 9.71,max h: 1.04,max u: 3.07,max v: 1.04\n",
      "Time: 9.80,max h: 1.03,max u: 3.06,max v: 1.04\n",
      "Time: 9.88,max h: 1.02,max u: 3.05,max v: 1.04\n",
      "Time: 9.96,max h: 1.01,max u: 3.04,max v: 1.04\n",
      "Time: 10.05,max h: 1.00,max u: 3.04,max v: 1.04\n",
      "Time: 10.13,max h: 0.99,max u: 3.03,max v: 1.03\n",
      "Time: 10.22,max h: 0.98,max u: 3.02,max v: 1.02\n",
      "Time: 10.31,max h: 0.97,max u: 3.02,max v: 1.00\n",
      "Time: 10.39,max h: 0.96,max u: 3.01,max v: 0.98\n",
      "Time: 10.48,max h: 0.96,max u: 3.00,max v: 0.97\n",
      "Time: 10.56,max h: 0.95,max u: 3.00,max v: 0.95\n",
      "Time: 10.65,max h: 0.94,max u: 2.99,max v: 0.95\n",
      "Time: 10.74,max h: 0.93,max u: 2.98,max v: 0.94\n",
      "Time: 10.83,max h: 0.93,max u: 2.97,max v: 0.93\n",
      "Time: 10.91,max h: 0.92,max u: 2.96,max v: 0.92\n",
      "Time: 11.00,max h: 0.91,max u: 2.96,max v: 0.90\n",
      "Time: 11.09,max h: 0.91,max u: 2.95,max v: 0.89\n",
      "Time: 11.18,max h: 0.90,max u: 2.95,max v: 0.88\n",
      "Time: 11.27,max h: 0.90,max u: 2.94,max v: 0.86\n",
      "Time: 11.36,max h: 0.89,max u: 2.94,max v: 0.84\n",
      "Time: 11.45,max h: 0.89,max u: 2.93,max v: 0.83\n",
      "Time: 11.53,max h: 0.88,max u: 2.93,max v: 0.85\n",
      "Time: 11.62,max h: 0.88,max u: 2.92,max v: 0.85\n",
      "Time: 11.71,max h: 0.87,max u: 2.92,max v: 0.85\n",
      "Time: 11.80,max h: 0.87,max u: 2.91,max v: 0.84\n",
      "Time: 11.89,max h: 0.87,max u: 2.90,max v: 0.84\n",
      "Time: 11.98,max h: 0.86,max u: 2.90,max v: 0.81\n",
      "Time: 12.07,max h: 0.86,max u: 2.89,max v: 0.81\n",
      "Time: 12.16,max h: 0.86,max u: 2.89,max v: 0.82\n",
      "Time: 12.26,max h: 0.86,max u: 2.88,max v: 0.81\n",
      "Time: 12.35,max h: 0.85,max u: 2.88,max v: 0.81\n",
      "Time: 12.44,max h: 0.85,max u: 2.87,max v: 0.82\n",
      "Time: 12.53,max h: 0.85,max u: 2.87,max v: 0.82\n",
      "Time: 12.62,max h: 0.85,max u: 2.87,max v: 0.85\n",
      "Time: 12.71,max h: 0.85,max u: 2.87,max v: 0.89\n",
      "Time: 12.80,max h: 0.84,max u: 2.86,max v: 0.93\n",
      "Time: 12.89,max h: 0.84,max u: 2.86,max v: 0.97\n",
      "Time: 12.99,max h: 0.84,max u: 2.86,max v: 1.01\n",
      "Time: 13.08,max h: 0.84,max u: 2.85,max v: 1.06\n",
      "Time: 13.17,max h: 0.84,max u: 2.84,max v: 1.10\n",
      "Time: 13.26,max h: 0.84,max u: 2.84,max v: 1.14\n",
      "Time: 13.35,max h: 0.84,max u: 2.84,max v: 1.18\n",
      "Time: 13.44,max h: 0.84,max u: 2.84,max v: 1.23\n",
      "Time: 13.54,max h: 0.84,max u: 2.84,max v: 1.27\n",
      "Time: 13.63,max h: 0.84,max u: 2.84,max v: 1.31\n",
      "Time: 13.72,max h: 0.84,max u: 2.84,max v: 1.35\n",
      "Time: 13.81,max h: 0.85,max u: 2.83,max v: 1.39\n",
      "Time: 13.90,max h: 0.85,max u: 2.83,max v: 1.43\n",
      "Time: 14.00,max h: 0.85,max u: 2.83,max v: 1.45\n",
      "Time: 14.09,max h: 0.85,max u: 2.82,max v: 1.48\n",
      "Time: 14.18,max h: 0.85,max u: 2.82,max v: 1.51\n",
      "Time: 14.27,max h: 0.85,max u: 2.82,max v: 1.53\n",
      "Time: 14.36,max h: 0.85,max u: 2.82,max v: 1.55\n",
      "Time: 14.46,max h: 0.86,max u: 2.82,max v: 1.54\n",
      "Time: 14.55,max h: 0.86,max u: 2.82,max v: 1.56\n",
      "Time: 14.64,max h: 0.86,max u: 2.82,max v: 1.57\n",
      "Time: 14.73,max h: 0.86,max u: 2.82,max v: 1.58\n",
      "Time: 14.82,max h: 0.86,max u: 2.82,max v: 1.59\n",
      "Time: 14.91,max h: 0.87,max u: 2.81,max v: 1.56\n",
      "Time: 15.01,max h: 0.87,max u: 2.81,max v: 1.55\n",
      "Time: 15.10,max h: 0.87,max u: 2.81,max v: 1.56\n",
      "Time: 15.19,max h: 0.87,max u: 2.81,max v: 1.56\n",
      "Time: 15.28,max h: 0.88,max u: 2.81,max v: 1.56\n",
      "Time: 15.37,max h: 0.88,max u: 2.81,max v: 1.55\n",
      "Time: 15.46,max h: 0.88,max u: 2.81,max v: 1.55\n",
      "Time: 15.55,max h: 0.88,max u: 2.82,max v: 1.54\n",
      "Time: 15.65,max h: 0.89,max u: 2.82,max v: 1.53\n",
      "Time: 15.74,max h: 0.89,max u: 2.81,max v: 1.50\n",
      "Time: 15.83,max h: 0.89,max u: 2.81,max v: 1.47\n",
      "Time: 15.92,max h: 0.90,max u: 2.81,max v: 1.45\n",
      "Time: 16.01,max h: 0.90,max u: 2.81,max v: 1.42\n",
      "Time: 16.10,max h: 0.90,max u: 2.81,max v: 1.41\n",
      "Time: 16.19,max h: 0.90,max u: 2.81,max v: 1.40\n",
      "Time: 16.28,max h: 0.91,max u: 2.81,max v: 1.40\n",
      "Time: 16.37,max h: 0.91,max u: 2.81,max v: 1.39\n",
      "Time: 16.46,max h: 0.91,max u: 2.81,max v: 1.38\n",
      "Time: 16.55,max h: 0.92,max u: 2.82,max v: 1.38\n",
      "Time: 16.64,max h: 0.92,max u: 2.82,max v: 1.37\n",
      "Time: 16.73,max h: 0.92,max u: 2.82,max v: 1.36\n",
      "Time: 16.82,max h: 0.92,max u: 2.82,max v: 1.35\n",
      "Time: 16.91,max h: 0.93,max u: 2.82,max v: 1.34\n",
      "Time: 17.00,max h: 0.93,max u: 2.82,max v: 1.33\n",
      "Time: 17.09,max h: 0.93,max u: 2.81,max v: 1.32\n",
      "Time: 17.18,max h: 0.93,max u: 2.81,max v: 1.30\n",
      "Time: 17.27,max h: 0.93,max u: 2.82,max v: 1.29\n",
      "Time: 17.36,max h: 0.93,max u: 2.82,max v: 1.28\n",
      "Time: 17.45,max h: 0.93,max u: 2.82,max v: 1.26\n",
      "Time: 17.54,max h: 0.93,max u: 2.82,max v: 1.25\n",
      "Time: 17.63,max h: 0.93,max u: 2.82,max v: 1.24\n",
      "Time: 17.72,max h: 0.93,max u: 2.82,max v: 1.23\n",
      "Time: 17.81,max h: 0.93,max u: 2.82,max v: 1.21\n",
      "Time: 17.90,max h: 0.93,max u: 2.82,max v: 1.20\n",
      "Time: 17.99,max h: 0.93,max u: 2.83,max v: 1.18\n",
      "Time: 18.08,max h: 0.92,max u: 2.83,max v: 1.17\n",
      "Time: 18.17,max h: 0.92,max u: 2.83,max v: 1.15\n",
      "Time: 18.26,max h: 0.91,max u: 2.83,max v: 1.15\n",
      "Time: 18.35,max h: 0.91,max u: 2.83,max v: 1.14\n",
      "Time: 18.44,max h: 0.90,max u: 2.83,max v: 1.14\n",
      "Time: 18.53,max h: 0.90,max u: 2.82,max v: 1.14\n",
      "Time: 18.62,max h: 0.89,max u: 2.82,max v: 1.13\n",
      "Time: 18.72,max h: 0.89,max u: 2.82,max v: 1.13\n",
      "Time: 18.81,max h: 0.88,max u: 2.82,max v: 1.12\n",
      "Time: 18.90,max h: 0.87,max u: 2.82,max v: 1.11\n",
      "Time: 18.99,max h: 0.87,max u: 2.82,max v: 1.11\n",
      "Time: 19.08,max h: 0.86,max u: 2.82,max v: 1.10\n",
      "Time: 19.17,max h: 0.86,max u: 2.82,max v: 1.09\n",
      "Time: 19.26,max h: 0.86,max u: 2.82,max v: 1.08\n",
      "Time: 19.36,max h: 0.85,max u: 2.82,max v: 1.06\n",
      "Time: 19.45,max h: 0.85,max u: 2.82,max v: 1.05\n",
      "Time: 19.54,max h: 0.85,max u: 2.83,max v: 1.05\n",
      "Time: 19.63,max h: 0.85,max u: 2.83,max v: 1.04\n",
      "Time: 19.72,max h: 0.85,max u: 2.82,max v: 1.03\n",
      "Time: 19.82,max h: 0.85,max u: 2.82,max v: 1.02\n",
      "Time: 19.91,max h: 0.85,max u: 2.82,max v: 1.01\n",
      "Time: 20.00,max h: 0.84,max u: 2.82,max v: 1.00\n",
      "Time: 20.09,max h: 0.84,max u: 2.81,max v: 0.99\n",
      "Time: 20.18,max h: 0.84,max u: 2.81,max v: 0.98\n",
      "Time: 20.28,max h: 0.84,max u: 2.81,max v: 0.97\n",
      "Time: 20.37,max h: 0.83,max u: 2.81,max v: 0.96\n",
      "Time: 20.46,max h: 0.83,max u: 2.80,max v: 0.95\n",
      "Time: 20.55,max h: 0.83,max u: 2.80,max v: 0.94\n",
      "Time: 20.65,max h: 0.83,max u: 2.80,max v: 0.94\n",
      "Time: 20.74,max h: 0.82,max u: 2.80,max v: 0.93\n",
      "Time: 20.83,max h: 0.82,max u: 2.80,max v: 0.92\n",
      "Time: 20.93,max h: 0.82,max u: 2.80,max v: 0.92\n",
      "Time: 21.02,max h: 0.81,max u: 2.80,max v: 0.92\n",
      "Time: 21.11,max h: 0.81,max u: 2.79,max v: 0.91\n",
      "Time: 21.21,max h: 0.81,max u: 2.79,max v: 0.91\n",
      "Time: 21.30,max h: 0.80,max u: 2.79,max v: 0.91\n",
      "Time: 21.39,max h: 0.80,max u: 2.78,max v: 0.90\n",
      "Time: 21.49,max h: 0.80,max u: 2.77,max v: 0.90\n",
      "Time: 21.58,max h: 0.79,max u: 2.77,max v: 0.90\n",
      "Time: 21.68,max h: 0.79,max u: 2.77,max v: 0.89\n",
      "Time: 21.77,max h: 0.79,max u: 2.76,max v: 0.89\n",
      "Time: 21.87,max h: 0.78,max u: 2.76,max v: 0.89\n",
      "Time: 21.96,max h: 0.78,max u: 2.76,max v: 0.89\n",
      "Time: 22.06,max h: 0.78,max u: 2.76,max v: 0.88\n",
      "Time: 22.15,max h: 0.78,max u: 2.76,max v: 0.88\n",
      "Time: 22.25,max h: 0.78,max u: 2.75,max v: 0.88\n",
      "Time: 22.34,max h: 0.77,max u: 2.75,max v: 0.88\n",
      "Time: 22.44,max h: 0.77,max u: 2.75,max v: 0.88\n",
      "Time: 22.53,max h: 0.77,max u: 2.74,max v: 0.87\n",
      "Time: 22.63,max h: 0.77,max u: 2.73,max v: 0.87\n",
      "Time: 22.72,max h: 0.76,max u: 2.73,max v: 0.87\n",
      "Time: 22.82,max h: 0.76,max u: 2.72,max v: 0.87\n",
      "Time: 22.92,max h: 0.76,max u: 2.72,max v: 0.87\n",
      "Time: 23.01,max h: 0.76,max u: 2.72,max v: 0.86\n",
      "Time: 23.11,max h: 0.76,max u: 2.71,max v: 0.86\n",
      "Time: 23.21,max h: 0.75,max u: 2.71,max v: 0.85\n",
      "Time: 23.30,max h: 0.75,max u: 2.71,max v: 0.85\n",
      "Time: 23.40,max h: 0.75,max u: 2.71,max v: 0.84\n",
      "Time: 23.50,max h: 0.75,max u: 2.70,max v: 0.84\n",
      "Time: 23.59,max h: 0.75,max u: 2.70,max v: 0.83\n",
      "Time: 23.69,max h: 0.74,max u: 2.70,max v: 0.83\n",
      "Time: 23.79,max h: 0.74,max u: 2.69,max v: 0.82\n",
      "Time: 23.89,max h: 0.74,max u: 2.68,max v: 0.81\n",
      "Time: 23.98,max h: 0.74,max u: 2.68,max v: 0.80\n",
      "Time: 24.08,max h: 0.73,max u: 2.68,max v: 0.79\n",
      "Time: 24.18,max h: 0.73,max u: 2.67,max v: 0.77\n",
      "Time: 24.28,max h: 0.73,max u: 2.67,max v: 0.76\n",
      "Time: 24.38,max h: 0.73,max u: 2.67,max v: 0.75\n",
      "Time: 24.47,max h: 0.73,max u: 2.67,max v: 0.75\n",
      "Time: 24.57,max h: 0.73,max u: 2.66,max v: 0.76\n",
      "Time: 24.67,max h: 0.73,max u: 2.66,max v: 0.76\n",
      "Time: 24.77,max h: 0.72,max u: 2.66,max v: 0.75\n",
      "Time: 24.87,max h: 0.72,max u: 2.65,max v: 0.75\n",
      "Time: 24.97,max h: 0.72,max u: 2.65,max v: 0.74\n",
      "Time: 25.07,max h: 0.72,max u: 2.64,max v: 0.74\n",
      "Time: 25.17,max h: 0.72,max u: 2.64,max v: 0.73\n",
      "Time: 25.26,max h: 0.71,max u: 2.63,max v: 0.76\n",
      "Time: 25.36,max h: 0.71,max u: 2.63,max v: 0.78\n",
      "Time: 25.46,max h: 0.71,max u: 2.63,max v: 0.81\n",
      "Time: 25.56,max h: 0.71,max u: 2.63,max v: 0.83\n",
      "Time: 25.66,max h: 0.71,max u: 2.62,max v: 0.86\n",
      "Time: 25.76,max h: 0.71,max u: 2.62,max v: 0.88\n",
      "Time: 25.86,max h: 0.71,max u: 2.62,max v: 0.91\n",
      "Time: 25.96,max h: 0.70,max u: 2.62,max v: 0.93\n",
      "Time: 26.06,max h: 0.70,max u: 2.62,max v: 0.91\n",
      "Time: 26.16,max h: 0.70,max u: 2.61,max v: 0.89\n",
      "Time: 26.26,max h: 0.70,max u: 2.61,max v: 0.92\n",
      "Time: 26.36,max h: 0.70,max u: 2.60,max v: 0.94\n",
      "Time: 26.46,max h: 0.70,max u: 2.60,max v: 0.95\n",
      "Time: 26.57,max h: 0.70,max u: 2.60,max v: 0.97\n",
      "Time: 26.67,max h: 0.69,max u: 2.59,max v: 0.99\n",
      "Time: 26.77,max h: 0.69,max u: 2.59,max v: 1.00\n",
      "Time: 26.87,max h: 0.69,max u: 2.59,max v: 1.02\n",
      "Time: 26.97,max h: 0.69,max u: 2.59,max v: 1.01\n",
      "Time: 27.07,max h: 0.69,max u: 2.59,max v: 1.00\n",
      "Time: 27.17,max h: 0.69,max u: 2.59,max v: 0.99\n",
      "Time: 27.27,max h: 0.69,max u: 2.58,max v: 0.99\n",
      "Time: 27.37,max h: 0.69,max u: 2.58,max v: 1.00\n",
      "Time: 27.48,max h: 0.69,max u: 2.58,max v: 1.01\n",
      "Time: 27.58,max h: 0.68,max u: 2.57,max v: 1.01\n",
      "Time: 27.68,max h: 0.68,max u: 2.57,max v: 1.02\n",
      "Time: 27.78,max h: 0.68,max u: 2.56,max v: 1.02\n",
      "Time: 27.88,max h: 0.68,max u: 2.56,max v: 1.02\n",
      "Time: 27.98,max h: 0.68,max u: 2.56,max v: 1.02\n",
      "Time: 28.09,max h: 0.68,max u: 2.56,max v: 1.03\n",
      "Time: 28.19,max h: 0.68,max u: 2.56,max v: 1.03\n",
      "Time: 28.29,max h: 0.68,max u: 2.55,max v: 1.02\n",
      "Time: 28.39,max h: 0.68,max u: 2.55,max v: 1.01\n",
      "Time: 28.50,max h: 0.68,max u: 2.55,max v: 1.00\n",
      "Time: 28.60,max h: 0.68,max u: 2.55,max v: 0.99\n",
      "Time: 28.70,max h: 0.68,max u: 2.55,max v: 0.98\n",
      "Time: 28.80,max h: 0.68,max u: 2.55,max v: 0.97\n",
      "Time: 28.90,max h: 0.68,max u: 2.55,max v: 0.97\n",
      "Time: 29.01,max h: 0.68,max u: 2.54,max v: 0.97\n",
      "Time: 29.11,max h: 0.67,max u: 2.54,max v: 0.96\n",
      "Time: 29.21,max h: 0.67,max u: 2.53,max v: 0.95\n",
      "Time: 29.32,max h: 0.67,max u: 2.53,max v: 0.94\n",
      "Time: 29.42,max h: 0.67,max u: 2.53,max v: 0.94\n",
      "Time: 29.52,max h: 0.67,max u: 2.53,max v: 0.94\n",
      "Time: 29.62,max h: 0.67,max u: 2.53,max v: 0.94\n",
      "Time: 29.73,max h: 0.67,max u: 2.53,max v: 0.93\n",
      "Time: 29.83,max h: 0.67,max u: 2.53,max v: 0.92\n",
      "Time: 29.93,max h: 0.67,max u: 2.53,max v: 0.92\n",
      "Time: 30.04,max h: 0.67,max u: 2.53,max v: 0.91\n",
      "Time: 30.14,max h: 0.67,max u: 2.53,max v: 0.90\n",
      "Time: 30.24,max h: 0.67,max u: 2.53,max v: 0.89\n",
      "Time: 30.35,max h: 0.67,max u: 2.53,max v: 0.89\n",
      "Time: 30.45,max h: 0.67,max u: 2.52,max v: 0.88\n",
      "Time: 30.55,max h: 0.67,max u: 2.52,max v: 0.88\n",
      "Time: 30.66,max h: 0.67,max u: 2.51,max v: 0.87\n",
      "Time: 30.76,max h: 0.67,max u: 2.51,max v: 0.87\n",
      "Time: 30.86,max h: 0.67,max u: 2.51,max v: 0.86\n",
      "Time: 30.97,max h: 0.67,max u: 2.51,max v: 0.86\n",
      "Time: 31.07,max h: 0.67,max u: 2.51,max v: 0.85\n",
      "Time: 31.17,max h: 0.67,max u: 2.50,max v: 0.84\n",
      "Time: 31.28,max h: 0.66,max u: 2.50,max v: 0.84\n",
      "Time: 31.38,max h: 0.66,max u: 2.50,max v: 0.84\n",
      "Time: 31.49,max h: 0.66,max u: 2.50,max v: 0.84\n",
      "Time: 31.59,max h: 0.66,max u: 2.50,max v: 0.84\n",
      "Time: 31.69,max h: 0.66,max u: 2.50,max v: 0.84\n",
      "Time: 31.80,max h: 0.66,max u: 2.50,max v: 0.84\n",
      "Time: 31.90,max h: 0.66,max u: 2.50,max v: 0.84\n",
      "Time: 32.01,max h: 0.73,max u: 2.50,max v: 0.83\n",
      "Time: 32.11,max h: 0.80,max u: 2.49,max v: 0.83\n",
      "Time: 32.21,max h: 0.86,max u: 2.49,max v: 0.83\n",
      "Time: 32.30,max h: 0.92,max u: 2.48,max v: 0.83\n",
      "Time: 32.40,max h: 0.98,max u: 2.48,max v: 0.82\n",
      "Time: 32.49,max h: 1.02,max u: 2.48,max v: 0.82\n",
      "Time: 32.59,max h: 1.06,max u: 2.48,max v: 0.82\n",
      "Time: 32.68,max h: 1.10,max u: 2.48,max v: 0.82\n",
      "Time: 32.77,max h: 1.12,max u: 2.48,max v: 0.84\n",
      "Time: 32.86,max h: 1.14,max u: 2.47,max v: 0.88\n",
      "Time: 32.95,max h: 1.16,max u: 2.47,max v: 0.92\n",
      "Time: 33.04,max h: 1.17,max u: 2.46,max v: 0.96\n",
      "Time: 33.13,max h: 1.18,max u: 2.45,max v: 0.99\n",
      "Time: 33.22,max h: 1.19,max u: 2.44,max v: 1.02\n",
      "Time: 33.31,max h: 1.20,max u: 2.43,max v: 1.07\n",
      "Time: 33.40,max h: 1.20,max u: 2.40,max v: 1.13\n",
      "Time: 33.49,max h: 1.21,max u: 2.39,max v: 1.18\n",
      "Time: 33.58,max h: 1.21,max u: 2.38,max v: 1.22\n",
      "Time: 33.67,max h: 1.21,max u: 2.38,max v: 1.26\n",
      "Time: 33.76,max h: 1.21,max u: 2.37,max v: 1.29\n",
      "Time: 33.85,max h: 1.21,max u: 2.36,max v: 1.32\n",
      "Time: 33.94,max h: 1.21,max u: 2.35,max v: 1.35\n",
      "Time: 34.03,max h: 1.21,max u: 2.34,max v: 1.42\n",
      "Time: 34.12,max h: 1.21,max u: 2.32,max v: 1.48\n",
      "Time: 34.21,max h: 1.20,max u: 2.31,max v: 1.52\n",
      "Time: 34.30,max h: 1.20,max u: 2.28,max v: 1.55\n",
      "Time: 34.40,max h: 1.20,max u: 2.25,max v: 1.57\n",
      "Time: 34.49,max h: 1.19,max u: 2.24,max v: 1.60\n",
      "Time: 34.58,max h: 1.19,max u: 2.23,max v: 1.65\n",
      "Time: 34.67,max h: 1.18,max u: 2.22,max v: 1.69\n",
      "Time: 34.77,max h: 1.18,max u: 2.21,max v: 1.73\n",
      "Time: 34.86,max h: 1.17,max u: 2.20,max v: 1.75\n",
      "Time: 34.96,max h: 1.17,max u: 2.18,max v: 1.76\n",
      "Time: 35.05,max h: 1.16,max u: 2.17,max v: 1.76\n",
      "Time: 35.14,max h: 1.16,max u: 2.15,max v: 1.76\n",
      "Time: 35.24,max h: 1.15,max u: 2.13,max v: 1.75\n",
      "Time: 35.33,max h: 1.15,max u: 2.10,max v: 1.74\n",
      "Time: 35.43,max h: 1.14,max u: 2.10,max v: 1.72\n",
      "Time: 35.53,max h: 1.14,max u: 2.09,max v: 1.70\n",
      "Time: 35.62,max h: 1.13,max u: 2.08,max v: 1.68\n",
      "Time: 35.72,max h: 1.13,max u: 2.07,max v: 1.66\n",
      "Time: 35.82,max h: 1.12,max u: 2.06,max v: 1.64\n",
      "Time: 35.92,max h: 1.11,max u: 2.04,max v: 1.61\n",
      "Time: 36.01,max h: 1.11,max u: 2.03,max v: 1.59\n",
      "Time: 36.11,max h: 1.10,max u: 2.01,max v: 1.56\n",
      "Time: 36.21,max h: 1.10,max u: 1.98,max v: 1.54\n",
      "Time: 36.31,max h: 1.09,max u: 1.97,max v: 1.51\n",
      "Time: 36.41,max h: 1.09,max u: 1.96,max v: 1.49\n",
      "Time: 36.51,max h: 1.08,max u: 1.95,max v: 1.47\n",
      "Time: 36.61,max h: 1.07,max u: 1.94,max v: 1.44\n",
      "Time: 36.72,max h: 1.07,max u: 1.93,max v: 1.42\n",
      "Time: 36.82,max h: 1.06,max u: 1.92,max v: 1.39\n",
      "Time: 36.92,max h: 1.06,max u: 1.90,max v: 1.37\n",
      "Time: 37.02,max h: 1.05,max u: 1.88,max v: 1.35\n",
      "Time: 37.12,max h: 1.05,max u: 1.86,max v: 1.32\n",
      "Time: 37.23,max h: 1.04,max u: 1.85,max v: 1.30\n",
      "Time: 37.33,max h: 1.03,max u: 1.84,max v: 1.27\n",
      "Time: 37.44,max h: 1.03,max u: 1.84,max v: 1.25\n",
      "Time: 37.54,max h: 1.02,max u: 1.83,max v: 1.22\n",
      "Time: 37.65,max h: 1.02,max u: 1.82,max v: 1.20\n",
      "Time: 37.75,max h: 1.01,max u: 1.80,max v: 1.17\n",
      "Time: 37.86,max h: 1.01,max u: 1.79,max v: 1.15\n",
      "Time: 37.96,max h: 1.00,max u: 1.77,max v: 1.12\n",
      "Time: 38.07,max h: 1.00,max u: 1.75,max v: 1.10\n",
      "Time: 38.18,max h: 0.99,max u: 1.74,max v: 1.08\n",
      "Time: 38.29,max h: 0.99,max u: 1.73,max v: 1.05\n",
      "Time: 38.40,max h: 0.98,max u: 1.73,max v: 1.03\n",
      "Time: 38.50,max h: 0.98,max u: 1.72,max v: 1.01\n",
      "Time: 38.61,max h: 0.97,max u: 1.71,max v: 0.99\n",
      "Time: 38.72,max h: 0.97,max u: 1.69,max v: 0.96\n",
      "Time: 38.83,max h: 0.96,max u: 1.68,max v: 0.94\n",
      "Time: 38.94,max h: 0.96,max u: 1.66,max v: 0.91\n",
      "Time: 39.05,max h: 0.95,max u: 1.65,max v: 0.89\n",
      "Time: 39.17,max h: 0.95,max u: 1.64,max v: 0.86\n",
      "Time: 39.28,max h: 0.95,max u: 1.63,max v: 0.84\n",
      "Time: 39.39,max h: 0.94,max u: 1.63,max v: 0.82\n",
      "Time: 39.50,max h: 0.94,max u: 1.62,max v: 0.81\n",
      "Time: 39.62,max h: 0.93,max u: 1.61,max v: 0.82\n",
      "Time: 39.73,max h: 0.93,max u: 1.59,max v: 0.83\n",
      "Time: 39.84,max h: 0.93,max u: 1.58,max v: 0.84\n",
      "Time: 39.96,max h: 0.92,max u: 1.56,max v: 0.83\n",
      "Time: 40.07,max h: 0.92,max u: 1.55,max v: 0.83\n",
      "Time: 40.19,max h: 0.92,max u: 1.54,max v: 0.81\n",
      "Time: 40.30,max h: 0.91,max u: 1.54,max v: 0.80\n",
      "Time: 40.42,max h: 0.91,max u: 1.53,max v: 0.80\n",
      "Time: 40.53,max h: 0.91,max u: 1.52,max v: 0.79\n",
      "Time: 40.65,max h: 0.91,max u: 1.50,max v: 0.80\n",
      "Time: 40.76,max h: 0.90,max u: 1.49,max v: 0.79\n",
      "Time: 40.88,max h: 0.90,max u: 1.48,max v: 0.79\n",
      "Time: 40.99,max h: 0.90,max u: 1.47,max v: 0.81\n",
      "Time: 41.10,max h: 0.90,max u: 1.46,max v: 0.82\n",
      "Time: 41.22,max h: 0.90,max u: 1.46,max v: 0.84\n",
      "Time: 41.33,max h: 0.90,max u: 1.45,max v: 0.88\n",
      "Time: 41.45,max h: 0.89,max u: 1.44,max v: 0.92\n",
      "Time: 41.56,max h: 0.89,max u: 1.43,max v: 0.95\n",
      "Time: 41.67,max h: 0.89,max u: 1.41,max v: 0.99\n",
      "Time: 41.79,max h: 0.89,max u: 1.40,max v: 0.98\n",
      "Time: 41.90,max h: 0.89,max u: 1.39,max v: 0.95\n",
      "Time: 42.02,max h: 0.89,max u: 1.39,max v: 0.94\n",
      "Time: 42.13,max h: 0.89,max u: 1.38,max v: 0.97\n",
      "Time: 42.25,max h: 0.89,max u: 1.37,max v: 1.00\n",
      "Time: 42.36,max h: 0.89,max u: 1.36,max v: 1.03\n",
      "Time: 42.48,max h: 0.89,max u: 1.35,max v: 1.06\n",
      "Time: 42.59,max h: 0.89,max u: 1.34,max v: 1.04\n",
      "Time: 42.71,max h: 0.89,max u: 1.33,max v: 1.02\n",
      "Time: 42.82,max h: 0.89,max u: 1.33,max v: 1.00\n",
      "Time: 42.94,max h: 0.89,max u: 1.32,max v: 1.02\n",
      "Time: 43.05,max h: 0.89,max u: 1.31,max v: 1.05\n",
      "Time: 43.16,max h: 0.89,max u: 1.31,max v: 1.07\n",
      "Time: 43.28,max h: 0.89,max u: 1.30,max v: 1.08\n",
      "Time: 43.39,max h: 0.89,max u: 1.29,max v: 1.06\n",
      "Time: 43.51,max h: 0.89,max u: 1.28,max v: 1.05\n",
      "Time: 43.62,max h: 0.89,max u: 1.26,max v: 1.04\n",
      "Time: 43.73,max h: 0.90,max u: 1.26,max v: 1.03\n",
      "Time: 43.84,max h: 0.90,max u: 1.25,max v: 1.05\n",
      "Time: 43.96,max h: 0.90,max u: 1.25,max v: 1.06\n",
      "Time: 44.07,max h: 0.90,max u: 1.24,max v: 1.08\n",
      "Time: 44.18,max h: 0.90,max u: 1.23,max v: 1.08\n",
      "Time: 44.29,max h: 0.90,max u: 1.22,max v: 1.07\n",
      "Time: 44.40,max h: 0.91,max u: 1.21,max v: 1.06\n",
      "Time: 44.51,max h: 0.91,max u: 1.20,max v: 1.05\n",
      "Time: 44.63,max h: 0.91,max u: 1.20,max v: 1.04\n",
      "Time: 44.74,max h: 0.91,max u: 1.19,max v: 1.04\n",
      "Time: 44.85,max h: 0.92,max u: 1.19,max v: 1.03\n",
      "Time: 44.96,max h: 0.92,max u: 1.18,max v: 1.03\n",
      "Time: 45.07,max h: 0.92,max u: 1.17,max v: 1.04\n",
      "Time: 45.18,max h: 0.93,max u: 1.16,max v: 1.04\n",
      "Time: 45.30,max h: 0.93,max u: 1.15,max v: 1.06\n",
      "Time: 45.41,max h: 0.93,max u: 1.14,max v: 1.07\n",
      "Time: 45.52,max h: 0.94,max u: 1.14,max v: 1.08\n",
      "Time: 45.63,max h: 0.94,max u: 1.13,max v: 1.06\n",
      "Time: 45.75,max h: 0.95,max u: 1.13,max v: 1.04\n",
      "Time: 45.86,max h: 0.95,max u: 1.12,max v: 1.03\n",
      "Time: 45.97,max h: 0.95,max u: 1.11,max v: 1.03\n",
      "Time: 46.08,max h: 0.96,max u: 1.10,max v: 1.02\n",
      "Time: 46.19,max h: 0.96,max u: 1.09,max v: 1.02\n",
      "Time: 46.30,max h: 0.96,max u: 1.09,max v: 1.01\n",
      "Time: 46.41,max h: 0.97,max u: 1.08,max v: 1.00\n",
      "Time: 46.53,max h: 0.97,max u: 1.08,max v: 1.00\n",
      "Time: 46.64,max h: 0.97,max u: 1.07,max v: 0.99\n",
      "Time: 46.75,max h: 0.97,max u: 1.06,max v: 0.99\n",
      "Time: 46.86,max h: 0.98,max u: 1.06,max v: 1.00\n",
      "Time: 46.97,max h: 0.98,max u: 1.05,max v: 1.00\n",
      "Time: 47.09,max h: 0.98,max u: 1.04,max v: 1.00\n",
      "Time: 47.20,max h: 0.98,max u: 1.03,max v: 1.00\n",
      "Time: 47.31,max h: 0.98,max u: 1.02,max v: 1.00\n",
      "Time: 47.42,max h: 0.98,max u: 1.02,max v: 1.01\n",
      "Time: 47.54,max h: 0.98,max u: 1.01,max v: 1.01\n",
      "Time: 47.65,max h: 0.98,max u: 1.01,max v: 1.01\n",
      "Time: 47.76,max h: 0.97,max u: 1.00,max v: 1.00\n",
      "Time: 47.87,max h: 0.97,max u: 0.99,max v: 0.99\n",
      "Time: 47.98,max h: 0.97,max u: 0.98,max v: 0.98\n",
      "Time: 48.10,max h: 0.97,max u: 0.98,max v: 0.97\n",
      "Time: 48.21,max h: 0.96,max u: 0.97,max v: 0.96\n",
      "Time: 48.32,max h: 0.96,max u: 0.97,max v: 0.96\n",
      "Time: 48.44,max h: 0.96,max u: 0.96,max v: 0.95\n",
      "Time: 48.55,max h: 0.95,max u: 0.95,max v: 0.94\n",
      "Time: 48.66,max h: 0.95,max u: 0.95,max v: 0.94\n",
      "Time: 48.78,max h: 0.94,max u: 0.94,max v: 0.93\n",
      "Time: 48.89,max h: 0.94,max u: 0.93,max v: 0.93\n",
      "Time: 49.01,max h: 0.93,max u: 0.92,max v: 0.93\n",
      "Time: 49.12,max h: 0.93,max u: 0.92,max v: 0.92\n",
      "Time: 49.24,max h: 0.93,max u: 0.91,max v: 0.92\n",
      "Time: 49.35,max h: 0.92,max u: 0.90,max v: 0.91\n",
      "Time: 49.47,max h: 0.92,max u: 0.90,max v: 0.90\n",
      "Time: 49.58,max h: 0.91,max u: 0.89,max v: 0.89\n",
      "Time: 49.70,max h: 0.90,max u: 0.88,max v: 0.88\n",
      "Time: 49.82,max h: 0.90,max u: 0.87,max v: 0.88\n",
      "Time: 49.93,max h: 0.89,max u: 0.87,max v: 0.88\n",
      "Time: 50.05,max h: 0.89,max u: 0.86,max v: 0.87\n",
      "Time: 50.17,max h: 0.88,max u: 0.86,max v: 0.86\n",
      "Time: 50.28,max h: 0.88,max u: 0.85,max v: 0.85\n",
      "Time: 50.40,max h: 0.87,max u: 0.84,max v: 0.84\n",
      "Time: 50.52,max h: 0.87,max u: 0.83,max v: 0.84\n",
      "Time: 50.64,max h: 0.86,max u: 0.82,max v: 0.82\n",
      "Time: 50.76,max h: 0.86,max u: 0.82,max v: 0.82\n",
      "Time: 50.88,max h: 0.86,max u: 0.81,max v: 0.81\n",
      "Time: 51.00,max h: 0.85,max u: 0.81,max v: 0.80\n",
      "Time: 51.12,max h: 0.85,max u: 0.80,max v: 0.79\n",
      "Time: 51.24,max h: 0.84,max u: 0.79,max v: 0.75\n",
      "Time: 51.36,max h: 0.84,max u: 0.78,max v: 0.73\n",
      "Time: 51.48,max h: 0.83,max u: 0.78,max v: 0.71\n",
      "Time: 51.60,max h: 0.83,max u: 0.77,max v: 0.70\n",
      "Time: 51.72,max h: 0.82,max u: 0.77,max v: 0.70\n",
      "Time: 51.84,max h: 0.82,max u: 0.76,max v: 0.69\n",
      "Time: 51.96,max h: 0.82,max u: 0.76,max v: 0.69\n",
      "Time: 52.08,max h: 0.81,max u: 0.75,max v: 0.70\n",
      "Time: 52.20,max h: 0.81,max u: 0.74,max v: 0.72\n",
      "Time: 52.32,max h: 0.81,max u: 0.73,max v: 0.74\n",
      "Time: 52.44,max h: 0.80,max u: 0.73,max v: 0.75\n",
      "Time: 52.56,max h: 0.80,max u: 0.72,max v: 0.76\n",
      "Time: 52.69,max h: 0.80,max u: 0.72,max v: 0.77\n",
      "Time: 52.81,max h: 0.80,max u: 0.71,max v: 0.78\n",
      "Time: 52.93,max h: 0.79,max u: 0.70,max v: 0.79\n",
      "Time: 53.05,max h: 0.79,max u: 0.69,max v: 0.80\n",
      "Time: 53.17,max h: 0.79,max u: 0.69,max v: 0.81\n",
      "Time: 53.29,max h: 0.79,max u: 0.69,max v: 0.81\n",
      "Time: 53.41,max h: 0.78,max u: 0.68,max v: 0.82\n",
      "Time: 53.53,max h: 0.78,max u: 0.67,max v: 0.82\n",
      "Time: 53.66,max h: 0.78,max u: 0.66,max v: 0.83\n",
      "Time: 53.78,max h: 0.78,max u: 0.66,max v: 0.83\n",
      "Time: 53.90,max h: 0.78,max u: 0.65,max v: 0.83\n",
      "Time: 54.02,max h: 0.77,max u: 0.65,max v: 0.78\n",
      "Time: 54.14,max h: 0.77,max u: 0.64,max v: 0.78\n",
      "Time: 54.27,max h: 0.77,max u: 0.64,max v: 0.78\n",
      "Time: 54.39,max h: 0.77,max u: 0.63,max v: 0.78\n",
      "Time: 54.51,max h: 0.77,max u: 0.62,max v: 0.79\n",
      "Time: 54.64,max h: 0.76,max u: 0.62,max v: 0.78\n",
      "Time: 54.76,max h: 0.76,max u: 0.61,max v: 0.77\n",
      "Time: 54.88,max h: 0.76,max u: 0.61,max v: 0.77\n",
      "Time: 55.00,max h: 0.76,max u: 0.60,max v: 0.76\n",
      "Time: 55.12,max h: 0.76,max u: 0.59,max v: 0.76\n",
      "Time: 55.24,max h: 0.76,max u: 0.59,max v: 0.76\n",
      "Time: 55.37,max h: 0.76,max u: 0.58,max v: 0.76\n",
      "Time: 55.49,max h: 0.75,max u: 0.58,max v: 0.78\n",
      "Time: 55.61,max h: 0.75,max u: 0.58,max v: 0.81\n",
      "Time: 55.73,max h: 0.75,max u: 0.57,max v: 0.83\n",
      "Time: 55.86,max h: 0.75,max u: 0.56,max v: 0.86\n",
      "Time: 55.98,max h: 0.75,max u: 0.56,max v: 0.88\n",
      "Time: 56.10,max h: 0.75,max u: 0.55,max v: 0.90\n",
      "Time: 56.23,max h: 0.75,max u: 0.55,max v: 0.90\n",
      "Time: 56.35,max h: 0.75,max u: 0.55,max v: 0.90\n",
      "Time: 56.47,max h: 0.75,max u: 0.54,max v: 0.92\n",
      "Time: 56.60,max h: 0.75,max u: 0.53,max v: 0.91\n",
      "Time: 56.72,max h: 0.75,max u: 0.53,max v: 0.89\n",
      "Time: 56.84,max h: 0.74,max u: 0.52,max v: 0.90\n",
      "Time: 56.96,max h: 0.74,max u: 0.52,max v: 0.88\n",
      "Time: 57.08,max h: 0.74,max u: 0.52,max v: 0.86\n",
      "Time: 57.21,max h: 0.74,max u: 0.51,max v: 0.84\n",
      "Time: 57.33,max h: 0.74,max u: 0.50,max v: 0.85\n",
      "Time: 57.45,max h: 0.74,max u: 0.50,max v: 0.86\n",
      "Time: 57.58,max h: 0.74,max u: 0.50,max v: 0.87\n",
      "Time: 57.70,max h: 0.74,max u: 0.49,max v: 0.88\n",
      "Time: 57.82,max h: 0.74,max u: 0.49,max v: 0.89\n",
      "Time: 57.95,max h: 0.74,max u: 0.48,max v: 0.91\n",
      "Time: 58.07,max h: 0.74,max u: 0.47,max v: 0.92\n",
      "Time: 58.19,max h: 0.74,max u: 0.47,max v: 0.93\n",
      "Time: 58.31,max h: 0.74,max u: 0.46,max v: 0.92\n",
      "Time: 58.44,max h: 0.74,max u: 0.46,max v: 0.92\n",
      "Time: 58.56,max h: 0.75,max u: 0.46,max v: 0.92\n",
      "Time: 58.68,max h: 0.75,max u: 0.45,max v: 0.92\n",
      "Time: 58.80,max h: 0.75,max u: 0.44,max v: 0.93\n",
      "Time: 58.93,max h: 0.75,max u: 0.44,max v: 0.92\n",
      "Time: 59.05,max h: 0.75,max u: 0.44,max v: 0.90\n",
      "Time: 59.17,max h: 0.75,max u: 0.43,max v: 0.89\n",
      "Time: 59.29,max h: 0.75,max u: 0.43,max v: 0.90\n",
      "Time: 59.42,max h: 0.75,max u: 0.42,max v: 0.90\n",
      "Time: 59.54,max h: 0.75,max u: 0.41,max v: 0.89\n",
      "Time: 59.66,max h: 0.75,max u: 0.41,max v: 0.88\n",
      "Time: 59.78,max h: 0.75,max u: 0.41,max v: 0.86\n",
      "Time: 59.91,max h: 0.75,max u: 0.40,max v: 0.85\n",
      "Time: 60.03,max h: 0.75,max u: 0.40,max v: 0.84\n",
      "Time: 60.15,max h: 0.75,max u: 0.39,max v: 0.83\n",
      "Time: 60.27,max h: 0.75,max u: 0.39,max v: 0.83\n",
      "Time: 60.39,max h: 0.75,max u: 0.38,max v: 0.82\n",
      "Time: 60.52,max h: 0.75,max u: 0.38,max v: 0.82\n",
      "Time: 60.64,max h: 0.75,max u: 0.38,max v: 0.82\n",
      "Time: 60.76,max h: 0.75,max u: 0.37,max v: 0.81\n",
      "Time: 60.88,max h: 0.75,max u: 0.37,max v: 0.81\n",
      "Time: 61.01,max h: 0.75,max u: 0.36,max v: 0.80\n",
      "Time: 61.13,max h: 0.75,max u: 0.36,max v: 0.80\n",
      "Time: 61.25,max h: 0.75,max u: 0.36,max v: 0.80\n",
      "Time: 61.38,max h: 0.75,max u: 0.35,max v: 0.79\n",
      "Time: 61.50,max h: 0.75,max u: 0.35,max v: 0.79\n",
      "Time: 61.62,max h: 0.75,max u: 0.34,max v: 0.79\n",
      "Time: 61.74,max h: 0.74,max u: 0.34,max v: 0.79\n",
      "Time: 61.87,max h: 0.74,max u: 0.34,max v: 0.79\n",
      "Time: 61.99,max h: 0.74,max u: 0.33,max v: 0.78\n",
      "Time: 62.11,max h: 0.74,max u: 0.33,max v: 0.78\n",
      "Time: 62.24,max h: 0.74,max u: 0.32,max v: 0.78\n",
      "Time: 62.36,max h: 0.74,max u: 0.32,max v: 0.78\n",
      "Time: 62.48,max h: 0.73,max u: 0.32,max v: 0.78\n",
      "Time: 62.61,max h: 0.73,max u: 0.31,max v: 0.78\n",
      "Time: 62.73,max h: 0.73,max u: 0.31,max v: 0.78\n",
      "Time: 62.86,max h: 0.73,max u: 0.31,max v: 0.78\n",
      "Time: 62.98,max h: 0.73,max u: 0.30,max v: 0.78\n",
      "Time: 63.11,max h: 0.72,max u: 0.30,max v: 0.78\n",
      "Time: 63.23,max h: 0.72,max u: 0.29,max v: 0.78\n",
      "Time: 63.35,max h: 0.72,max u: 0.29,max v: 0.78\n",
      "Time: 63.48,max h: 0.72,max u: 0.29,max v: 0.78\n",
      "Time: 63.60,max h: 0.71,max u: 0.29,max v: 0.77\n",
      "Time: 63.73,max h: 0.71,max u: 0.28,max v: 0.77\n",
      "Time: 63.85,max h: 0.71,max u: 0.28,max v: 0.77\n",
      "Time: 63.98,max h: 0.71,max u: 0.28,max v: 0.77\n",
      "Time: 64.10,max h: 0.71,max u: 0.27,max v: 0.77\n",
      "Time: 64.23,max h: 0.70,max u: 0.27,max v: 0.78\n",
      "Time: 64.36,max h: 0.70,max u: 0.27,max v: 0.78\n",
      "Time: 64.48,max h: 0.70,max u: 0.26,max v: 0.78\n",
      "Time: 64.61,max h: 0.70,max u: 0.26,max v: 0.78\n",
      "Time: 64.74,max h: 0.70,max u: 0.26,max v: 0.78\n",
      "Time: 64.86,max h: 0.70,max u: 0.26,max v: 0.78\n",
      "Time: 64.99,max h: 0.69,max u: 0.25,max v: 0.79\n",
      "Time: 65.11,max h: 0.69,max u: 0.25,max v: 0.79\n",
      "Time: 65.24,max h: 0.69,max u: 0.24,max v: 0.80\n",
      "Time: 65.36,max h: 0.69,max u: 0.24,max v: 0.81\n",
      "Time: 65.49,max h: 0.69,max u: 0.24,max v: 0.82\n",
      "Time: 65.62,max h: 0.69,max u: 0.24,max v: 0.83\n",
      "Time: 65.75,max h: 0.69,max u: 0.24,max v: 0.76\n",
      "Time: 65.87,max h: 0.69,max u: 0.23,max v: 0.75\n",
      "Time: 66.00,max h: 0.68,max u: 0.23,max v: 0.75\n",
      "Time: 66.13,max h: 0.68,max u: 0.23,max v: 0.75\n",
      "Time: 66.25,max h: 0.68,max u: 0.23,max v: 0.75\n",
      "Time: 66.38,max h: 0.68,max u: 0.22,max v: 0.75\n",
      "Time: 66.51,max h: 0.68,max u: 0.22,max v: 0.75\n",
      "Time: 66.63,max h: 0.68,max u: 0.22,max v: 0.75\n",
      "Time: 66.76,max h: 0.68,max u: 0.21,max v: 0.75\n",
      "Time: 66.89,max h: 0.68,max u: 0.21,max v: 0.74\n",
      "Time: 67.01,max h: 0.68,max u: 0.21,max v: 0.74\n",
      "Time: 67.14,max h: 0.68,max u: 0.21,max v: 0.74\n",
      "Time: 67.27,max h: 0.68,max u: 0.21,max v: 0.73\n",
      "Time: 67.40,max h: 0.67,max u: 0.20,max v: 0.73\n",
      "Time: 67.53,max h: 0.67,max u: 0.20,max v: 0.73\n",
      "Time: 67.65,max h: 0.67,max u: 0.20,max v: 0.73\n",
      "Time: 67.78,max h: 0.67,max u: 0.20,max v: 0.73\n",
      "Time: 67.91,max h: 0.67,max u: 0.19,max v: 0.73\n",
      "Time: 68.04,max h: 0.67,max u: 0.19,max v: 0.73\n",
      "Time: 68.16,max h: 0.67,max u: 0.19,max v: 0.72\n",
      "Time: 68.29,max h: 0.67,max u: 0.19,max v: 0.72\n",
      "Time: 68.42,max h: 0.67,max u: 0.18,max v: 0.72\n",
      "Time: 68.55,max h: 0.67,max u: 0.18,max v: 0.74\n",
      "Time: 68.67,max h: 0.67,max u: 0.18,max v: 0.75\n",
      "Time: 68.80,max h: 0.67,max u: 0.17,max v: 0.75\n",
      "Time: 68.93,max h: 0.67,max u: 0.17,max v: 0.76\n",
      "Time: 69.06,max h: 0.66,max u: 0.17,max v: 0.78\n",
      "Time: 69.19,max h: 0.66,max u: 0.17,max v: 0.78\n",
      "Time: 69.32,max h: 0.66,max u: 0.16,max v: 0.79\n",
      "Time: 69.44,max h: 0.66,max u: 0.16,max v: 0.78\n",
      "Time: 69.57,max h: 0.66,max u: 0.16,max v: 0.79\n",
      "Time: 69.70,max h: 0.66,max u: 0.15,max v: 0.78\n",
      "Time: 69.83,max h: 0.66,max u: 0.15,max v: 0.79\n",
      "Time: 69.96,max h: 0.66,max u: 0.15,max v: 0.78\n",
      "Time: 70.08,max h: 0.66,max u: 0.15,max v: 0.77\n",
      "Time: 70.21,max h: 0.66,max u: 0.15,max v: 0.76\n",
      "Time: 70.34,max h: 0.66,max u: 0.14,max v: 0.75\n",
      "Time: 70.47,max h: 0.66,max u: 0.14,max v: 0.76\n",
      "Time: 70.60,max h: 0.65,max u: 0.14,max v: 0.77\n",
      "Time: 70.73,max h: 0.65,max u: 0.13,max v: 0.78\n",
      "Time: 70.86,max h: 0.65,max u: 0.13,max v: 0.79\n",
      "Time: 70.99,max h: 0.65,max u: 0.13,max v: 0.79\n",
      "Time: 71.11,max h: 0.65,max u: 0.12,max v: 0.80\n",
      "Time: 71.24,max h: 0.65,max u: 0.12,max v: 0.80\n",
      "Time: 71.37,max h: 0.65,max u: 0.12,max v: 0.81\n",
      "Time: 71.50,max h: 0.65,max u: 0.12,max v: 0.82\n",
      "Time: 71.63,max h: 0.65,max u: 0.11,max v: 0.82\n",
      "Time: 71.76,max h: 0.65,max u: 0.11,max v: 0.83\n",
      "Time: 71.89,max h: 0.64,max u: 0.10,max v: 0.84\n",
      "Time: 72.02,max h: 0.64,max u: 0.10,max v: 0.85\n",
      "Time: 72.15,max h: 0.64,max u: 0.10,max v: 0.85\n",
      "Time: 72.28,max h: 0.64,max u: 0.10,max v: 0.85\n",
      "Time: 72.41,max h: 0.64,max u: 0.09,max v: 0.85\n",
      "Time: 72.54,max h: 0.64,max u: 0.09,max v: 0.84\n",
      "Time: 72.66,max h: 0.64,max u: 0.09,max v: 0.85\n",
      "Time: 72.79,max h: 0.64,max u: 0.09,max v: 0.84\n",
      "Time: 72.92,max h: 0.64,max u: 0.09,max v: 0.84\n",
      "Time: 73.05,max h: 0.64,max u: 0.10,max v: 0.83\n",
      "Time: 73.18,max h: 0.64,max u: 0.10,max v: 0.82\n",
      "Time: 73.31,max h: 0.64,max u: 0.10,max v: 0.83\n",
      "Time: 73.44,max h: 0.64,max u: 0.09,max v: 0.83\n",
      "Time: 73.57,max h: 0.64,max u: 0.09,max v: 0.82\n",
      "Time: 73.70,max h: 0.64,max u: 0.09,max v: 0.81\n",
      "Time: 73.83,max h: 0.64,max u: 0.09,max v: 0.81\n",
      "Time: 73.96,max h: 0.64,max u: 0.09,max v: 0.80\n",
      "Time: 74.09,max h: 0.64,max u: 0.09,max v: 0.80\n",
      "Time: 74.22,max h: 0.64,max u: 0.09,max v: 0.80\n",
      "Time: 74.35,max h: 0.64,max u: 0.09,max v: 0.81\n",
      "Time: 74.48,max h: 0.64,max u: 0.09,max v: 0.80\n",
      "Time: 74.61,max h: 0.64,max u: 0.09,max v: 0.79\n",
      "Time: 74.74,max h: 0.64,max u: 0.09,max v: 0.79\n",
      "Time: 74.87,max h: 0.64,max u: 0.09,max v: 0.79\n",
      "Time: 75.00,max h: 0.64,max u: 0.10,max v: 0.78\n",
      "Time: 75.13,max h: 0.63,max u: 0.10,max v: 0.78\n",
      "Time: 75.26,max h: 0.63,max u: 0.10,max v: 0.78\n",
      "Time: 75.39,max h: 0.63,max u: 0.10,max v: 0.78\n",
      "Time: 75.52,max h: 0.63,max u: 0.10,max v: 0.78\n",
      "Time: 75.65,max h: 0.63,max u: 0.11,max v: 0.79\n",
      "Time: 75.78,max h: 0.63,max u: 0.11,max v: 0.79\n",
      "Time: 75.91,max h: 0.63,max u: 0.11,max v: 0.79\n",
      "Time: 76.04,max h: 0.62,max u: 0.12,max v: 0.79\n",
      "Time: 76.18,max h: 0.62,max u: 0.12,max v: 0.79\n",
      "Time: 76.31,max h: 0.62,max u: 0.13,max v: 0.79\n",
      "Time: 76.44,max h: 0.62,max u: 0.13,max v: 0.79\n",
      "Time: 76.57,max h: 0.62,max u: 0.13,max v: 0.79\n",
      "Time: 76.70,max h: 0.62,max u: 0.14,max v: 0.78\n",
      "Time: 76.84,max h: 0.62,max u: 0.14,max v: 0.78\n",
      "Time: 76.97,max h: 0.62,max u: 0.12,max v: 0.78\n",
      "Time: 77.10,max h: 0.62,max u: 0.12,max v: 0.78\n",
      "Time: 77.23,max h: 0.62,max u: 0.08,max v: 0.77\n",
      "Time: 77.36,max h: 0.62,max u: 0.06,max v: 0.77\n",
      "Time: 77.49,max h: 0.62,max u: 0.05,max v: 0.78\n",
      "Time: 77.63,max h: 0.62,max u: 0.05,max v: 0.78\n",
      "Time: 77.76,max h: 0.62,max u: 0.06,max v: 0.79\n",
      "Time: 77.89,max h: 0.62,max u: 0.06,max v: 0.79\n",
      "Time: 78.02,max h: 0.62,max u: 0.07,max v: 0.80\n",
      "Time: 78.16,max h: 0.62,max u: 0.08,max v: 0.80\n",
      "Time: 78.29,max h: 0.62,max u: 0.08,max v: 0.80\n",
      "Time: 78.42,max h: 0.62,max u: 0.08,max v: 0.81\n",
      "Time: 78.55,max h: 0.62,max u: 0.08,max v: 0.81\n",
      "Time: 78.68,max h: 0.64,max u: 0.08,max v: 0.81\n",
      "Time: 78.81,max h: 0.66,max u: 0.08,max v: 0.81\n",
      "Time: 78.94,max h: 0.68,max u: 0.08,max v: 0.81\n",
      "Time: 79.07,max h: 0.70,max u: 0.07,max v: 0.81\n",
      "Time: 79.20,max h: 0.72,max u: 0.07,max v: 0.82\n",
      "Time: 79.33,max h: 0.73,max u: 0.07,max v: 0.82\n",
      "Time: 79.45,max h: 0.75,max u: 0.07,max v: 0.82\n",
      "Time: 79.58,max h: 0.76,max u: 0.10,max v: 0.78\n",
      "Time: 79.70,max h: 0.77,max u: 0.10,max v: 0.78\n",
      "Time: 79.83,max h: 0.78,max u: 0.10,max v: 0.78\n",
      "Time: 79.95,max h: 0.78,max u: 0.10,max v: 0.77\n",
      "Time: 80.08,max h: 0.79,max u: 0.10,max v: 0.77\n",
      "Time: 80.20,max h: 0.80,max u: 0.10,max v: 0.77\n",
      "Time: 80.33,max h: 0.81,max u: 0.10,max v: 0.77\n",
      "Time: 80.45,max h: 0.81,max u: 0.10,max v: 0.77\n",
      "Time: 80.58,max h: 0.82,max u: 0.10,max v: 0.77\n",
      "Time: 80.70,max h: 0.82,max u: 0.09,max v: 0.77\n",
      "Time: 80.83,max h: 0.83,max u: 0.09,max v: 0.78\n",
      "Time: 80.96,max h: 0.83,max u: 0.09,max v: 0.79\n",
      "Time: 81.08,max h: 0.84,max u: 0.09,max v: 0.79\n",
      "Time: 81.21,max h: 0.84,max u: 0.08,max v: 0.79\n",
      "Time: 81.34,max h: 0.84,max u: 0.08,max v: 0.82\n",
      "Time: 81.47,max h: 0.85,max u: 0.09,max v: 0.84\n",
      "Time: 81.59,max h: 0.85,max u: 0.13,max v: 0.84\n",
      "Time: 81.72,max h: 0.85,max u: 0.15,max v: 0.84\n",
      "Time: 81.85,max h: 0.86,max u: 0.17,max v: 0.83\n",
      "Time: 81.98,max h: 0.86,max u: 0.19,max v: 0.81\n",
      "Time: 82.11,max h: 0.86,max u: 0.20,max v: 0.79\n",
      "Time: 82.24,max h: 0.86,max u: 0.22,max v: 0.76\n",
      "Time: 82.37,max h: 0.86,max u: 0.29,max v: 0.75\n",
      "Time: 82.50,max h: 0.86,max u: 0.36,max v: 0.75\n",
      "Time: 82.63,max h: 0.86,max u: 0.42,max v: 0.74\n",
      "Time: 82.76,max h: 0.86,max u: 0.49,max v: 0.73\n",
      "Time: 82.89,max h: 0.86,max u: 0.58,max v: 0.73\n",
      "Time: 83.02,max h: 0.86,max u: 0.64,max v: 0.72\n",
      "Time: 83.15,max h: 0.86,max u: 0.68,max v: 0.72\n",
      "Time: 83.28,max h: 0.86,max u: 0.70,max v: 0.72\n",
      "Time: 83.42,max h: 0.86,max u: 0.72,max v: 0.71\n",
      "Time: 83.55,max h: 0.86,max u: 0.73,max v: 0.72\n",
      "Time: 83.68,max h: 0.86,max u: 0.74,max v: 0.72\n",
      "Time: 83.81,max h: 0.85,max u: 0.75,max v: 0.72\n",
      "Time: 83.95,max h: 0.85,max u: 0.79,max v: 0.70\n",
      "Time: 84.08,max h: 0.85,max u: 0.81,max v: 0.69\n",
      "Time: 84.21,max h: 0.85,max u: 0.82,max v: 0.72\n",
      "Time: 84.35,max h: 0.84,max u: 0.86,max v: 0.72\n",
      "Time: 84.48,max h: 0.84,max u: 0.89,max v: 0.68\n",
      "Time: 84.62,max h: 0.84,max u: 0.91,max v: 0.68\n",
      "Time: 84.75,max h: 0.83,max u: 0.93,max v: 0.68\n",
      "Time: 84.89,max h: 0.83,max u: 0.94,max v: 0.68\n",
      "Time: 85.03,max h: 0.83,max u: 0.94,max v: 0.69\n",
      "Time: 85.16,max h: 0.82,max u: 0.97,max v: 0.69\n",
      "Time: 85.30,max h: 0.82,max u: 0.99,max v: 0.69\n",
      "Time: 85.44,max h: 0.82,max u: 1.01,max v: 0.70\n",
      "Time: 85.57,max h: 0.81,max u: 1.01,max v: 0.71\n",
      "Time: 85.71,max h: 0.81,max u: 1.01,max v: 0.77\n",
      "Time: 85.85,max h: 0.81,max u: 1.01,max v: 0.83\n",
      "Time: 85.99,max h: 0.80,max u: 1.01,max v: 0.82\n",
      "Time: 86.12,max h: 0.80,max u: 0.99,max v: 0.80\n",
      "Time: 86.26,max h: 0.80,max u: 0.98,max v: 0.78\n",
      "Time: 86.40,max h: 0.79,max u: 1.00,max v: 0.76\n",
      "Time: 86.54,max h: 0.79,max u: 1.03,max v: 0.73\n",
      "Time: 86.68,max h: 0.79,max u: 1.05,max v: 0.73\n",
      "Time: 86.81,max h: 0.79,max u: 1.05,max v: 0.77\n",
      "Time: 86.95,max h: 0.78,max u: 1.06,max v: 0.81\n",
      "Time: 87.09,max h: 0.78,max u: 1.06,max v: 0.84\n",
      "Time: 87.22,max h: 0.78,max u: 1.06,max v: 0.87\n",
      "Time: 87.36,max h: 0.78,max u: 1.08,max v: 0.89\n",
      "Time: 87.50,max h: 0.78,max u: 1.09,max v: 0.92\n",
      "Time: 87.63,max h: 0.78,max u: 1.09,max v: 0.92\n",
      "Time: 87.77,max h: 0.77,max u: 1.09,max v: 0.90\n",
      "Time: 87.91,max h: 0.77,max u: 1.08,max v: 0.89\n",
      "Time: 88.04,max h: 0.77,max u: 1.08,max v: 0.87\n",
      "Time: 88.18,max h: 0.77,max u: 1.08,max v: 0.86\n",
      "Time: 88.31,max h: 0.77,max u: 1.08,max v: 0.84\n",
      "Time: 88.45,max h: 0.77,max u: 1.08,max v: 0.83\n",
      "Time: 88.59,max h: 0.77,max u: 1.08,max v: 0.81\n",
      "Time: 88.73,max h: 0.77,max u: 1.09,max v: 0.80\n",
      "Time: 88.86,max h: 0.77,max u: 1.10,max v: 0.80\n",
      "Time: 89.00,max h: 0.77,max u: 1.09,max v: 0.79\n",
      "Time: 89.14,max h: 0.77,max u: 1.09,max v: 0.78\n",
      "Time: 89.27,max h: 0.77,max u: 1.08,max v: 0.77\n",
      "Time: 89.41,max h: 0.77,max u: 1.09,max v: 0.77\n",
      "Time: 89.54,max h: 0.77,max u: 1.13,max v: 0.79\n",
      "Time: 89.68,max h: 0.78,max u: 1.15,max v: 0.81\n",
      "Time: 89.81,max h: 0.78,max u: 1.16,max v: 0.82\n",
      "Time: 89.95,max h: 0.78,max u: 1.17,max v: 0.84\n",
      "Time: 90.08,max h: 0.78,max u: 1.17,max v: 0.85\n",
      "Time: 90.21,max h: 0.78,max u: 1.16,max v: 0.86\n",
      "Time: 90.35,max h: 0.78,max u: 1.16,max v: 0.88\n",
      "Time: 90.48,max h: 0.79,max u: 1.14,max v: 0.89\n",
      "Time: 90.61,max h: 0.79,max u: 1.13,max v: 0.90\n",
      "Time: 90.75,max h: 0.79,max u: 1.12,max v: 0.91\n",
      "Time: 90.88,max h: 0.79,max u: 1.10,max v: 0.92\n",
      "Time: 91.02,max h: 0.79,max u: 1.08,max v: 0.92\n",
      "Time: 91.15,max h: 0.80,max u: 1.07,max v: 0.91\n",
      "Time: 91.29,max h: 0.80,max u: 1.08,max v: 0.91\n",
      "Time: 91.42,max h: 0.80,max u: 1.13,max v: 0.90\n",
      "Time: 91.55,max h: 0.80,max u: 1.16,max v: 0.89\n",
      "Time: 91.69,max h: 0.80,max u: 1.17,max v: 0.88\n",
      "Time: 91.82,max h: 0.81,max u: 1.18,max v: 0.87\n",
      "Time: 91.95,max h: 0.81,max u: 1.18,max v: 0.86\n",
      "Time: 92.08,max h: 0.81,max u: 1.17,max v: 0.86\n",
      "Time: 92.21,max h: 0.81,max u: 1.16,max v: 0.86\n",
      "Time: 92.34,max h: 0.81,max u: 1.15,max v: 0.85\n",
      "Time: 92.47,max h: 0.81,max u: 1.13,max v: 0.84\n",
      "Time: 92.61,max h: 0.81,max u: 1.12,max v: 0.83\n",
      "Time: 92.74,max h: 0.81,max u: 1.10,max v: 0.83\n",
      "Time: 92.87,max h: 0.81,max u: 1.08,max v: 0.82\n",
      "Time: 93.01,max h: 0.81,max u: 1.08,max v: 0.82\n",
      "Time: 93.14,max h: 0.81,max u: 1.09,max v: 0.82\n",
      "Time: 93.27,max h: 0.81,max u: 1.10,max v: 0.82\n",
      "Time: 93.41,max h: 0.80,max u: 1.13,max v: 0.81\n",
      "Time: 93.54,max h: 0.80,max u: 1.15,max v: 0.81\n",
      "Time: 93.67,max h: 0.80,max u: 1.15,max v: 0.80\n",
      "Time: 93.81,max h: 0.80,max u: 1.15,max v: 0.80\n",
      "Time: 93.94,max h: 0.80,max u: 1.15,max v: 0.81\n",
      "Time: 94.07,max h: 0.80,max u: 1.13,max v: 0.81\n",
      "Time: 94.20,max h: 0.80,max u: 1.12,max v: 0.81\n",
      "Time: 94.34,max h: 0.79,max u: 1.10,max v: 0.82\n",
      "Time: 94.47,max h: 0.79,max u: 1.08,max v: 0.82\n",
      "Time: 94.61,max h: 0.79,max u: 1.06,max v: 0.82\n",
      "Time: 94.74,max h: 0.79,max u: 1.07,max v: 0.83\n",
      "Time: 94.88,max h: 0.79,max u: 1.08,max v: 0.83\n",
      "Time: 95.01,max h: 0.79,max u: 1.09,max v: 0.83\n",
      "Time: 95.15,max h: 0.79,max u: 1.09,max v: 0.83\n",
      "Time: 95.28,max h: 0.78,max u: 1.10,max v: 0.82\n",
      "Time: 95.42,max h: 0.78,max u: 1.11,max v: 0.82\n",
      "Time: 95.55,max h: 0.78,max u: 1.12,max v: 0.82\n",
      "Time: 95.69,max h: 0.78,max u: 1.12,max v: 0.81\n",
      "Time: 95.82,max h: 0.78,max u: 1.11,max v: 0.81\n",
      "Time: 95.96,max h: 0.78,max u: 1.09,max v: 0.80\n",
      "Time: 96.09,max h: 0.78,max u: 1.08,max v: 0.80\n",
      "Time: 96.23,max h: 0.77,max u: 1.06,max v: 0.80\n",
      "Time: 96.37,max h: 0.77,max u: 1.04,max v: 0.80\n",
      "Time: 96.50,max h: 0.77,max u: 1.05,max v: 0.79\n",
      "Time: 96.64,max h: 0.77,max u: 1.06,max v: 0.79\n",
      "Time: 96.78,max h: 0.77,max u: 1.07,max v: 0.78\n",
      "Time: 96.91,max h: 0.77,max u: 1.07,max v: 0.78\n",
      "Time: 97.05,max h: 0.77,max u: 1.07,max v: 0.77\n",
      "Time: 97.19,max h: 0.76,max u: 1.07,max v: 0.77\n",
      "Time: 97.33,max h: 0.76,max u: 1.08,max v: 0.77\n",
      "Time: 97.46,max h: 0.76,max u: 1.08,max v: 0.77\n",
      "Time: 97.60,max h: 0.76,max u: 1.08,max v: 0.77\n",
      "Time: 97.74,max h: 0.76,max u: 1.07,max v: 0.77\n",
      "Time: 97.88,max h: 0.76,max u: 1.06,max v: 0.77\n",
      "Time: 98.01,max h: 0.76,max u: 1.04,max v: 0.77\n",
      "Time: 98.15,max h: 0.76,max u: 1.03,max v: 0.76\n",
      "Time: 98.29,max h: 0.75,max u: 1.03,max v: 0.76\n",
      "Time: 98.43,max h: 0.75,max u: 1.04,max v: 0.76\n",
      "Time: 98.57,max h: 0.75,max u: 1.05,max v: 0.76\n",
      "Time: 98.71,max h: 0.75,max u: 1.06,max v: 0.76\n",
      "Time: 98.85,max h: 0.75,max u: 1.06,max v: 0.76\n",
      "Time: 98.99,max h: 0.75,max u: 1.06,max v: 0.76\n",
      "Time: 99.13,max h: 0.75,max u: 1.05,max v: 0.75\n",
      "Time: 99.27,max h: 0.74,max u: 1.05,max v: 0.75\n",
      "Time: 99.40,max h: 0.74,max u: 1.05,max v: 0.75\n",
      "Time: 99.54,max h: 0.74,max u: 1.05,max v: 0.75\n",
      "Time: 99.68,max h: 0.74,max u: 1.04,max v: 0.75\n",
      "Time: 99.82,max h: 0.74,max u: 1.03,max v: 0.74\n",
      "Time: 99.96,max h: 0.74,max u: 1.04,max v: 0.74\n",
      "Time: 100.00,max h: 0.74,max u: 1.04,max v: 0.74\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaEAAAGgCAYAAAAD9NhnAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAJ5hJREFUeJzt3QucTfX+//HPMGaMyzDIjOvk1riVimKEEsclicjJpZJEikp+D7ccl0Ic08lBJHUO51A4KkKiaYhoEso1Jg4iGipm3JoxzPf3+Hx//73/s8eoGQ3fsef1fDyWPXuttddea5lZ7/39fj977wBjjBEAABwo4OJJAQBQhBAAwBlCCADgDCEEAHCGEAIAOEMIAQCcIYQAAM4QQgAAZwghAIAzhBDgRx5//HG58cYbXe8GkG2EEK5bc+bMkYCAADutX7/+kuX6iVSVKlWyy++//37JSw4ePOjdd88UGhoqt956q7z++uty8eJF17sIXBOB1+ZpgKuncOHC8u6770qTJk185q9du1Z++OEHCQ4OzrOnv1u3bnLffffZn5OTk2XFihXy7LPPyvfffy8xMTGudw+46mgJ4bqnF/FFixbJhQsXfOZrMNWvX18iIiIkr7r99tvlkUcesVP//v1l+fLlcscdd9h9B/IDQgjXPW1N/PLLLxIbG+udd/78eXnvvfeke/fuWT7m1VdflcaNG0vp0qUlJCTEhpWun5luU1tYJUuWlGLFiklUVJS8+OKLPutMmzZN6tSpI0WKFJGwsDBp0KDBFYeIdsuFh4dLYKBvJ8WHH34o7dq1k/Lly9uWXbVq1WTs2LHZ6rbL7rHqcw8YMECWLFkidevWtc+jx7Vy5cpL1j1y5Ij07t3buz9VqlSRp59+2p53j6SkJBk4cKDtEtV1qlevLn/9618lPT39is4N/BPdcbju6UB8dHS0zJ8/X9q2bWvnffzxx7Z7q2vXrjJ16tRLHjNlyhR54IEHpEePHvbCuWDBAunSpYttiejFXu3atcuOJd1yyy3y8ssv2wvpvn37ZMOGDd7tvPXWW/Lcc8/JQw89JM8//7ykpKTI9u3bZePGjZcNwIzOnTsnP//8s/351KlTdr/1oj98+PBLxr80BAcNGmRvV69eLaNGjbKP+b1uu+wcq4eOrX3wwQfyzDPPSPHixe2569y5sxw6dMiGmDp69KjceeedNmT69u0rNWvWtKGkwabHExQUZG/vvvtuO/+pp56SypUryxdffGGP68cff5S///3vv3tukE/o9wkB16PZs2frd2GZTZs2mddff90UL17cnDt3zi7r0qWLad68uf05MjLStGvXzuexnvU8zp8/b+rWrWvuvfde77zJkyfb7f/000+X3YcOHTqYOnXq5HjfDxw4YLed1fT000+b9PT039xf9dRTT5kiRYqYlJQU77yePXva483psSp97qCgILNv3z7vvG3bttn506ZN88577LHHTIECBex5z8yz32PHjjVFixY13333nc/yYcOGmYIFC5pDhw797jlC/kB3HPzCn//8Z/n111/tq/vTp0/b299qiWi3lMfJkydtq6lp06by9ddfe+drF5ynK+xyXUi6jhY/bNq06Yr2W1sS2uWn0/vvv2/Hhd58803b4rnc/urxaetJ91dbHHv27PnN58jOsXq0bNnSdvV5aCtQq/b2799v7+t50O669u3b227HrLr0lI7R6XNo96Tuq2fS7WsX4rp163J0nuC/6I6DX7jhhhvsBU7HYvTCrBc67SK7HA2pcePGydatWyU1NfWSi6h6+OGH5e2335Ynn3xShg0bJi1atJBOnTrZ7RYo8H+v34YOHSqffvqp7Z7SMY9WrVrZ8Lvrrruytd81atSw++2h29d90O6qJ554Qm6++WZv1+Bf/vIX2w2nXXAZaaj8luwcq4d2m2WmQaLhpX766Sf7/Dpm9Fv27t1ruyX1/yUrx48f/83HI/8ghOA39OLfp08fSUxMtGNDnpZMZp9//rkdI2nWrJnMmDFDypUrJ4UKFZLZs2f7FBRoC0Jfsa9Zs0Y++ugjO1azcOFCuffee+WTTz6RggULSq1atSQhIcFe6HW5tmZ0mzpe89JLL13RcWjY6XuF9Lk1hHTsRcdXtEWiY1PaUtGydG3JaAj+1kB/do/VQ48pK//XW5d9uk9/+tOfZMiQIVkuv+mmm3K0PfgvQgh+48EHH7SD4F9++aUNi8vRoNCL+KpVq3zeQ6QX5sy0xaOhoNNrr70mr7zyiowYMcIGk6cFU7RoUdtq0kkH/rU1M378eDsIr8+TU55S8zNnztjbzz77zFb/acGAhonHgQMHfndbOTnW7NCWjYbhzp07f3M9DUrd/4ytPCArjAnBb2jV2BtvvCFjxoyxYxaXo6/2tSsqY3mzfoKB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",
      "text/plain": [
       "<Figure size 1000x1000 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "def run_simulation():\n",
    "    # # 生成网格\n",
    "    # nodes, elements, areas, centroids, edge_to_elements = generate_mesh(lc=3)\n",
    "    \n",
    "    # # 初始化求解器\n",
    "    # solver = ShallowWaterSolver(nodes, elements, areas, centroids, edge_to_elements)#,b\n",
    "    # set_initial_conditions(solver, case='dam_break')\n",
    "\n",
    "     # 生成网格\n",
    "    nodes, elements, areas, centroids, edge_to_elements,zb = generate_mesh(lc=2)\n",
    "    \n",
    "    # 初始化求解器\n",
    "    solver = ShallowWaterSolver(nodes, elements, areas, centroids, edge_to_elements,zb)#\n",
    "    set_initial_conditions(solver, case='dam_break')\n",
    "    \n",
    "    # 模拟参数\n",
    "    t_end = 100.0\n",
    "    dt = 0.1\n",
    "    output_interval = 0.5\n",
    "    \n",
    "    # 结果存储\n",
    "    results = {\n",
    "        'time': [], \n",
    "        'h': [],\n",
    "        'u': [],\n",
    "        'v': [],\n",
    "        'mass': []\n",
    "    }\n",
    "    \n",
    "    # 主循环\n",
    "    t = 0\n",
    "    results['time'].append(t)\n",
    "    results['h'].append(solver.h.copy())\n",
    "    results['u'].append(solver.u.copy())\n",
    "    results['v'].append(solver.v.copy())\n",
    "    results['mass'].append(np.sum(solver.h * solver.areas))\n",
    "    while t < t_end:\n",
    "        # 动态时间步长\n",
    "        current_dt = min(10, t_end - t)\n",
    "        dt=solver.time_step(current_dt)\n",
    "        t += dt\n",
    "        # print(f\"Time: {t:.2f}\",solver.h)\n",
    "        print(f\"Time: {t:.2f},max h: {np.max(solver.h):.2f},max u: {np.max(solver.u):.2f},max v: {np.max(solver.v):.2f}\")\n",
    "        # 记录结果\n",
    "        if len(results['time']) == 0 or t >= results['time'][-1] + output_interval:\n",
    "            results['time'].append(t)\n",
    "            results['h'].append(solver.h.copy())\n",
    "            results['u'].append(solver.u.copy())\n",
    "            results['v'].append(solver.v.copy())\n",
    "            results['mass'].append(np.sum(solver.h * solver.areas))\n",
    "    \n",
    "    #可视化\n",
    "    import matplotlib.pyplot as plt\n",
    "    fig=plt.figure(figsize=(10, 10))\n",
    "\n",
    "    \n",
    "    \n",
    "    plt.subplot(221)\n",
    "    plt.plot(results['time'], results['mass'])\n",
    "    plt.title('Mass Balance')\n",
    "    \n",
    "    \n",
    "\n",
    "    return results,solver\n",
    "# run_simulation()\n",
    "results,solver=run_simulation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "44413d45",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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hN12202tWrVKzZ07V5VKpSl5T0qFdOLpfRutmQwUg/M388E5nPngHM5scP5mPlN9DqnlgMIB+bZGgwb6Pvvss/pqvtS+llKeNKv1YDbRcAGBmmH22GOPaXlv+oVCQJi54PzNfHAOZz44hzMbnL+Zz1Sew0ZrOUiHBFqmmsWLF6vW1la1bt26mtfpObVqZEGvh6w/FWAWIwAAAAAAAIS6Nx122GHq7rvvrr5Gg5Tp+VFHHZW5Db1ur0/cddddzvWbsgUBAAAAAACAmcr555+vTj/9dHX44YerI444Ql1zzTV6lqIzzjhD//y0005Tu+++u7riiiv083PPPVe96U1vUv/4j/+o3vWud6lbbrlFPfTQQ+ob3/jGtO0DAkKlHxkNNpnt/clmKzh/Mx+cw5kPzuHMBudv5oNz2DicfPLJasOGDeqSSy7RA41putI777yzOhD5+eef113qDa973evUzTffrD71qU+pT3ziE+qAAw7QMxi94hWvmLZ9aLj7IAAAAAAAAACmD4xBAAAAAAAAAFRBQAAAAAAAAABUQUAAAAAAAAAAVEFAAAAAAAAAAFRp+oBw7bXXqr333lvfTOPII49UDz744K6jAxoKmg7sNa95jb7L9tKlS9UJJ5ygnnzyyZp1hoaG1Nlnn60WLVqkb41+0kknTbr5CGgMrrzySn1nyo997GPV13D+Gp8XX3xR/cVf/IX+Hevu7lavfOUr9XR8Bpr3gmbuWLFihf75Mccco5566qlprRnsYnx8XF188cVqn3320ednv/32U5/97Gf1eTPgHDYWP/3pT9Xxxx+v71hMfzNpdhsbn/O1efNmdeqpp+obqM2fP1+deeaZqr+/f4r3BMwkmjog3HrrrXquWpri9JFHHlGHHHKIOu6449T69eunuzSQwb333qvN/wMPPKBvIDI6OqqOPfZYPbew4bzzzlN33HGHuu222/T6q1evVieeeCKOZ4Pxi1/8Qn39619XBx98cM3rOH+NzZYtW9TrX/961d7ern70ox+p//3f/9Xzdi9YsKC6zhe+8AX15S9/WV1//fXq5z//uZozZ47+u0rhD0w/n//859XXvvY19dWvflU9/vjj+jmds6985SvVdXAOGwv6jiN/Qhc0s/A5XxQOfvvb3+rvzu9///s6dHzoQx+awr0AM46kiTniiCOSs88+u/p8fHw82W233ZIrrrhiWusCfqxfv54ueSX33nuvfr5169akvb09ue2226rrPP7443qd+++/H4e1QdixY0dywAEHJHfddVfypje9KTn33HP16zh/jc8FF1yQvOENb3D+vFwuJ8uXL0+++MUvVl+j89rZ2Zn8y7/8yxRVCfJ417velXzgAx+oee3EE09MTj31VP0Y57Cxoe+z22+/vfrc53z97//+r97uF7/4RXWdH/3oR0mpVEpefPHFKd4DMFNo2haEkZER9fDDD+umOAPdtIKe33///dNaG/Bj27Zt+v+FCxfq/+l8UquCfU5Xrlyp9tprL5zTBoJagehOkfZ5InD+Gp/vfe97+s6g733ve3U3v1e96lXqm9/8ZvXnzz77rL4pkH1u582bp7tv4u9qY0A3ZLr77rvV7373O/38V7/6lfrZz36m3vGOd+jnOIczC5/zRf9TtyL63TXQ+uR5qMUBgCya9k7KGzdu1H0xzV3tDPT8iSeemLa6gB/lcln3XafuDuZOg/RHsqOjQ/8hTJ9T+hmYfuj28dSdj7oYpcH5a3yeeeYZ3T2FumbS3T7pPP7N3/yN/r07/fTTq79nWX9X8TvYGFx44YVq+/bt+uJJa2ur/h68/PLLdRcUAudwZuFzvuh/CvQ2bW1t+uIafi+Bi6YNCGDmX4V+7LHH9JUvMDNYtWqVOvfcc3UfWJoUAMzMYE5XIT/3uc/p59SCQL+H1PeZAgJofL773e+q73znO+rmm29WL3/5y9Wjjz6qL7bQAFicQwCAoWm7GC1evFhfPUnPcEPPly9fPm11gWLOOeccPcjqnnvuUXvssUf1dTpv1HVs69atNevjnDYG1IWIJgB49atfra9e0UIDyWlwHT2mK144f40NzZJy0EEH1bx24IEHqueff14/Nn878Xe1cfm7v/s73Yrwvve9T89A9f73v19PDkCzxBE4hzMLn/NF/6cnXxkbG9MzG8HvABdNGxCoSfywww7TfTHtq2P0/KijjprW2kA2ND6LwsHtt9+ufvzjH+tp+mzofNLsKvY5pWlQybzgnE4/b33rW9VvfvMbfcXSLHQ1mro2mMc4f40NdelLTy1Mfdlf8pKX6Mf0O0mGw/4dpO4s1M8Zv4ONweDgoO57bkMXy+j7j8A5nFn4nC/6ny6c0UUaA32H0jmnsQoAZJI0Mbfccose6X/TTTfpUf4f+tCHkvnz5ydr166d7tJABn/913+dzJs3L/nJT36SrFmzproMDg5W1/nwhz+c7LXXXsmPf/zj5KGHHkqOOuoovYDGxJ7FiMD5a2wefPDBpK2tLbn88suTp556KvnOd76T9PT0JP/8z/9cXefKK6/Uf0f/4z/+I/n1r3+dvOc970n22WefZOfOndNaO5jg9NNPT3bffffk+9//fvLss88m//Zv/5YsXrw4+fjHP149RDiHjTfz2y9/+Uu9kG276qqr9OM//OEP3ufr7W9/e/KqV70q+fnPf5787Gc/0zPJnXLKKdO4V6DRaeqAQHzlK1/RhrKjo0NPe/rAAw9Md0nAAf1hzFpuvPHG6jr0B/EjH/lIsmDBAm1c/uRP/kSHCDAzAgLOX+Nzxx13JK94xSv0xZWVK1cm3/jGN2p+TtMuXnzxxcmyZcv0Om9961uTJ598ctrqBbVs375d/87R915XV1ey7777Jp/85CeT4eHh6jo4h43FPffck/ndR2HP93xt2rRJB4Le3t6kr68vOeOMM3TwAMBFif7JblsAAAAAAAAANBtNOwYBAAAAAAAAMBkEBAAAAAAAAEAVBAQAAAAAAABAFQQEAAAAAAAAQBUEBAAAAAAAAEAVBAQAAAAAAABAFQQEAAAAAAAAQBUEBAAAAAAAAEAVBAQAAAAAAABAFQQEAAAAAAAAQBUEBAAAAAAAAEAVBAQAAAAAAACAMvz/3vaCSIDCY1EAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib\n",
    "from scipy.interpolate import griddata\n",
    "from matplotlib.animation import FuncAnimation\n",
    "def plotTri(solver,results,fig):    \n",
    "    # plt.subplot(223)\n",
    "    # 绘制三角形边线\n",
    "    triangles1=matplotlib.tri.Triangulation(solver.nodes[:,0],solver.nodes[:,1], solver.elements)\n",
    "    # plt.triplot(\n",
    "    #     solver.nodes[:, 0], solver.nodes[:, 1], solver.elements,\n",
    "    #     color='k', linewidth=0.5, alpha=0.5\n",
    "    # )\n",
    "    # 将中心值插值到所有顶点\n",
    "    vertex_values = griddata(\n",
    "        solver.centroids,        # 已知点,                # 已知点（三角形中心）\n",
    "        results['h'][0],          # 已知值\n",
    "        solver.nodes,                 # 需要插值的点（顶点）\n",
    "        method='nearest'        # 插值方法（最近邻/线性等）\n",
    "    )\n",
    "    trip=plt.tripcolor(triangles1, vertex_values,cmap='viridis')\n",
    "    plt.colorbar(trip, label='Value')\n",
    "\n",
    "    # 更新函数（每一帧调用）\n",
    "    def update(frame):\n",
    "        trip.set_array(results['h'][frame])  # 更新顶点值\n",
    "        plt.title(f't: {results[\"time\"][frame]}')\n",
    "        return trip,\n",
    "\n",
    "    ani = FuncAnimation(\n",
    "        fig, \n",
    "        update, \n",
    "        frames=len(results['h']),  # 总帧数\n",
    "        interval=2000,  # 帧间隔（毫秒）\n",
    "        blit=True      # 优化渲染性能\n",
    "    )\n",
    "\n",
    "    ani.save(\"animation.gif\", writer=\"pillow\", fps=15)\n",
    "    # plt.title('Init Water Depth')\n",
    "\n",
    "fig=plt.figure(figsize=(10, 5))\n",
    "plotTri(solver,results,fig)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
